处理多个文件后返回每个文件的记录数

时间:2014-04-14 12:50:04

标签: awk

我有以下代码,它运行在多个制表符分隔的文本文件上。它汇总特定字段的金额并计算每个文件的记录数(处理多个文件)。输出为文件名,字段总和,记录计数 - 每个文件。一切顺利。唯一的问题是,不是获取每个文件的记录数,而是获得处理的整批文件的累积计数。我怎样才能解决这个问题?我尝试用'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文件

3 个答案:

答案 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 }