シェルスクリプトのファイル操作

シェルスクリプトのファイル操作

固有パターンで始まる行数を抽出し、パターンと発生回数を次の形式で印刷する必要があります。パターン区切り記号は/でなければなりません。

file.txt には次のエントリが含まれています。

path1/path1/Dockerfile
path1/path1/path1.config
path2/inputdir/Dockerfile
path2/inputdir/path1.config
path2/outputdir/path1.config
pipelines/pipeline1.yml
pipelines/jobs/job1.yml

出力は次のようにする必要があります

path1=2
path2=3
pipelines=2

次のようにawkを使用していますが、入力としてパターンマッチングが必要です(例:path1、動的ドライバが必要です)。

awk '/^path1/{a++}END{print a}' files.txt

誰でもこれについてアドバイスできますか?ありがとうございます。

ベストアンサー1

各最上位ディレクトリ名の数を追跡しようとしています。これはawk、ディレクトリ名をキーとして使用する連想配列を使用する最も簡単な方法です。その後、/ディレクトリ名(最初のフィールド)に簡単にアクセスできるように、各行を区切りフィールドのセットとして読み取ることができます。

awk -F / '{ count[$1]++ } END { for (name in count) printf "%s=%s\n", name, count[name] }' file

複数行レイアウトを使用するコード:

awk -F / '
    { count[$1]++ }
    END {
        for (name in count)
            printf "%s=%s\n", name, count[name]
    }' file

これは香水を呼び起こす独自のコードですが、各行の先頭にある特定の文字列を一致させようとはしません。代わりに、フィールドが/(コマンドラインで注文された-F /)区切りであることを考慮して、として最初のフィールドを選択します$1

これにより、最初のフィールドの値が名前付き配列のキーとして使用されますcount。スカラー変数を使用していますが、配列を使用するとさまざまaawk値を一度に追跡できるため、最初のフィールドに関連する値だけを増やすだけです。

count最後に、配列から収集されたすべてのキーを繰り返し、各キーに関連付けられた値とともに印刷します。

出力には順序がなく、awk使用している項目に応じてコマンドを実行するたびに異なる順序で表示されることがあります。


出力形式がそれほど重要ではない場合は、最初のフィールドを切り取り、cutソートしてから(データがまだソートされていない場合)、一意の文字列数を数えることでこの問題を解決できます。

$ cut -d / -f 1 file | sort | uniq -c
   2 path1
   3 path2
   2 pipelines

おすすめ記事