我有以下代码,它运行在多个制表符分隔的文本文件上。它汇总特定字段的金额并计算每个文件的记录数(处理多个文件)。输出为文件名,字段总和,记录计数 - 每个文件。一切顺利。唯一的问题是,不是获取每个文件的记录数,而是获得处理的整批文件的累积计数。我怎样才能解决这个问题?我尝试用'FNR'替换'NR'。这也行不通。
我通过.bat文件调用awk
awk -f SumColumnRecordCount.awk *.txt
这是awk文件中的代码
BEGIN { FS="\t" }
{ sum[FILENAME] += $42 }
END {
for (i=1;i<ARGC;i++)
printf "%s %15d %d\n",ARGV[i],sum[ARGV[i]],NR >>"output.txt"
}
使用GAWK(GNU AWK?)在Windows 7中运行.bat文件
答案 0 :(得分:4)
GNU AWK可让您访问ENDFILE function。因此,您真正需要的是:
BEGIN {
FS="\t"
}
{
sum += $42
}
ENDFILE {
printf "%s %15d %d\n", FILENAME, sum, FNR > "output.txt"
sum = 0
}
答案 1 :(得分:1)
尝试快速修改代码(也应该使用GNU&lt; 4和非GNU awks):
BEGIN { FS="\t" }
{ sum[FILENAME] += $42
last[FILENAME] = FNR }
END {
for (i=1;i<ARGC;i++)
printf "%s %15d %d\n",ARGV[i],sum[ARGV[i]],last[ARGV[i]] >>"output.txt"
}
没有数组的awk版本(也应该与GNU&lt; 4和非GNU awks一起使用):
BEGIN {
FS="\t"
}
function pr() {
printf "%s %15d %d\n", f, sum, last >>"output.txt"
}
FNR==1 {
if(NR>1) pr()
sum=last=0
f=FILENAME
}
{
sum+=$42
last++
}
END {
pr()
}
- edit-- 如果一个或多个输入文件完全为空,则第二个版本将不会使用文件名打印0 ..(感谢@edmorton)
答案 2 :(得分:1)
如果您有GNU awk 4
,则可以使用BEGINFILE/ENDFILE
来实现此目的:
BEGINFILE { sum = 0; FS="\t" }
{ sum += $42 }
ENDFILE { printf "%s %15d %d\n", FILENAME, sum, NR }