AWK处理压缩文件并打印原始(压缩)文件名

时间:2014-08-01 22:32:36

标签: awk output filenames gawk compression

我想用gawk处理多个.gz文件。 我正在考虑解压缩并将其传递给gawk 但我还要求在输出中存储/打印原始文件名。

事情是有100个.gz文件,其大小相当大。 寻找异常(约0.001%行),并希望打印出发现的不一致列表ALONG与包含它的文件名和行号。

如果我可以解压缩所有文件,我只需使用FILENAME变量即可。 由于这些文件的数量和大小都很大,我无法提前解压缩它们。

如何将文件名(除了gzip标准输出)传递给gawk以产生所需的输出?

2 个答案:

答案 0 :(得分:3)

假设你循环遍历所有文件并将他们的解压缩直接输入到awk中,以下内容将会起作用。

for file in *.gz; do
    gunzip -c "$file" | awk -v origname="$file" '.... {print origname " whatever"}'
done

编辑:要使用除直接动画之外的某些来源的文件名列表,可以使用以下内容。

$ ls *.awk
a.awk  e.awk
$ while IFS= read -d '' filename; do
echo "$filename";
done < <(find . -name \*.awk -printf '%P\0')
e.awk
a.awk

要使用xargs而不是上面的循环,将需要命令的主体位于预先编写的脚本文件中,我相信可以使用xargs和文件名调用该文件。

答案 1 :(得分:0)

这是使用xargssh的组合(为了能够在两个命令上使用管道:gzipawk):

find *.gz -print0 | xargs -0 -I fname sh -c 'gzip -dc fname | gawk -v origfile="fname" -f printbadrowsonly.awk >> baddata.txt'

我想知道上述方法是否有任何不良做法......