我正在尝试在 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
文件名中没有转义序列。