在bash中,对多个文件执行相同列的求和

时间:2016-06-28 21:42:23

标签: bash gawk

我有20个文件,每个文件包含19列和3000行。

现在我要总结文件1~4,保持第一列完整(第一列对所有文件都相同),但是在这四个文件中加上第2列到第19列。即汇总文件1,2,3,4的第2,3,......,19行,超过3000行。

我有DOS1 DOS2文件... DOS20。

如何做到这一点?

我发现这样的命令有效:

pr -m -t -s\  test1 test2 test3 | gawk '{print $1+$5+$9,$2+$6+$10,$3+$7+$11,$4+$8+$12}' > test4.dat

但是,我有19列要添加,具体写它们并不整齐。测试文件只有3列。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您“只”拥有3000行,则可以将所有内容保存在内存中:

awk '
  !((FNR,1) in d) { d[FNR,1] = $1 }
  { for (c=2;c<=NF;++i) d[FNR,c] += $c }
  END { for (r=1;(r,1) in d;++r) {
          printf "%s", d[r,1];
          for(c=2;(r,c) in d;++c)
            printf " %f", d[r,c];
          printf "\n";
       }
  ' DOC{1..4}

此awk程序将聚合您在命令行中列出的所有文件。它假设每行的第一列在所有文件中都是相同的,但它允许某些文件比其他文件更长(因为我太懒了,无法检查它们的长度是否相同)。