列をzgrepし、一致するファイル名を出力します。

列をzgrepし、一致するファイル名を出力します。

Linux マシン上の何千もの gzip 圧縮ファイル内の特定の列のパターンを一致させようとしています。一致に基づいてファイル名を印刷したいのですが、どうすればよいでしょうか。以下のオプションは機能しません。何か提案があれば教えてください。よろしくお願いします。

zgrep 12345 *|  awk -F"^" '{if($8==12345) print}' 
find . -type f |xargs zcat |  awk -F"^" '{if($8==12345) print}' 

答え1

最も明確でシンプルなのは、私見では次のとおりです。

while IFS= read -r fname; do
    zcat "$fname" | awk -F'^' -v fname="$fname" '$8==12345{print fname, $0}'
done < <(find . -type f)

ただし、zgrep からファイル名を印刷し、awk で読み取るというオプションもあり、これはより効率的かもしれません (ただし、ファイル名に:s が含まれていないことが条件です)。

zgrep -H '12345' * |
awk -F'^' '{fname=$0; sub(/:.*/,"",fname); sub(/[^:]+:/,"")} $8==12345{print fname, $0}'

どちらの解決策も、ファイル名に改行が含まれていないことを前提としており、最初の解決策では、\tファイル名にエスケープ シーケンスが含まれていないことも前提としています。

関連情報