我想用gawk处理多个.gz文件。 我正在考虑解压缩并将其传递给gawk 但我还要求在输出中存储/打印原始文件名。
事情是有100个.gz文件,其大小相当大。 寻找异常(约0.001%行),并希望打印出发现的不一致列表ALONG与包含它的文件名和行号。
如果我可以解压缩所有文件,我只需使用FILENAME变量即可。 由于这些文件的数量和大小都很大,我无法提前解压缩它们。
如何将文件名(除了gzip标准输出)传递给gawk以产生所需的输出?
答案 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)
这是使用xargs
和sh
的组合(为了能够在两个命令上使用管道:gzip
和awk
):
find *.gz -print0 | xargs -0 -I fname sh -c 'gzip -dc fname | gawk -v origfile="fname" -f printbadrowsonly.awk >> baddata.txt'
我想知道上述方法是否有任何不良做法......