Linuxシステムでは、何千ものgzip圧縮ファイル内の特定の列のパターンを一致させようとしており、一致に基づいてファイル名を印刷しようとしています。次のオプションは私には適していません。提案を教えてください。ありがとう
zgrep 12345 *| awk -F"^" '{if($8==12345) print}'
find . -type f |xargs zcat | awk -F"^" '{if($8==12345) print}'
答え1
最も明確でシンプルなIMHOは次のとおりです。
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
にエスケープシーケンスがないと仮定します。