
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
ファイル名にエスケープ シーケンスが含まれていないことも前提としています。