grepを使用してawkを使用して一意のエントリを見つけると、その値がファイルに表示される回数とファイル名も取得できますか?
私はこれを試しました:
zgrep '2020-04-20|12345|' FILENAME_* |awk -F '|' '{print $2 "|" $3 "|" $4}' | sort | uniq -c
ファイルの列2、3、4には一意の項目が表示されますが、その項目を含むファイルの名前を知りたいです。どうすればいいですか?
答え1
~のため圧縮されていないそして圧縮ファイルを確認して、以下を試してください。
for f in FILENAME_*; do
zcat -f "$f" | awk '/2020-04-20\|12345\|/ {rec=$2 "|" $3 "|" $4; a[rec]+=1}
END {for (rec in a) print FILENAME " : " rec " : " a[rec]}'
done > output.txt
簡単な説明:
- まず、ワイルドカード(
*
)を使用して可能なすべてのファイル名を繰り返します。 - 入力ファイルを解凍するには
zcat -f <filename>
(参照1、2...)必要に応じてすぐに実行できます(-f
オプション)。 zcat -f <filename> | awk ...
ファイルの解凍出力を$f
入力として使用しますawk
。- 見つかったパターンごとに解析されたレコードの値が見つかるたびに、相関係数の
2020-04-20|12345|
配列が増加します。a
$2 | $3 | $4
awk
END
ファイル(チャンク)と関連配列rec
の各コンポーネントの解析が完了すると、接続はa
ファイル名「FILENAME」、rec
値$2 | $3 | $4
、およびその値が発生した回数を印刷しますa[rec]
。awk
現在処理されているファイル「FILENAME」の名前など、いくつかの便利な内部変数を使用できるようにします。for
ループの連続出力への単一のリダイレクトはoutput.txt
完全にオプションです。抑制するとstdout
。
=====================================
正解は編集する@AdminBee、@roaima、@dave_thompson、および@kusalanandaの有用なコメントに基づいて改善されました。