计算许多文件中每第三列的总和

时间:2017-07-26 10:14:59

标签: bash awk

我有很多文件有三列,格式为:

 file1 | file2

1 0 1  | 1 0 2

2 3 3  | 2 3 7

3 6 2  | 3 6 0

4 1 0  | 4 1 3

5 2 4  | 5 2 1

每个文件中前两列相同。我想计算每个文件中3列的总和,以便接收这样的内容:

1 0 3

2 3 10

3 6 2

4 1 3

5 2 5

对于两个文件awk 'FNR==NR { _a[FNR]=$3;} NR!=FNR { $3 += _a[FNR]; print; }' file* 完美地工作(我通过谷歌找到了这个解决方案)。如何在许多文件上更改它?

3 个答案:

答案 0 :(得分:3)

您只需要:

awk '{sum[FNR]+=$3} ARGIND==(ARGC-1){print $1, $2, sum[FNR]}' file*

上面使用的GNU awk用于ARGIND。使用其他awk时,只需在开头添加FNR==1{ARGIND++}

答案 1 :(得分:1)

由于前两列在每个文件中都相同:

awk 'NR==FNR{b[FNR]=$1 FS $2;}{a[FNR]+=$3}END{for(i=1;i<=length(a);i++){print b[i] FS a[i];}}' file*

数组a用于获取所有文件的第3列的累积和。 数组b用于第1和第2列值 最后,我们打印数组ab

的内容

答案 2 :(得分:1)

<强> 文件1

$ cat f1
1 0 1 

2 3 3 

3 6 2 

4 1 0 

5 2 4 

<强> file2的

$ cat f2
1 0 2

2 3 7

3 6 0

4 1 3

5 2 1

<强> 输出

$ awk -v start=3 'NF{for(i=1; i<=NF; i++)a[FNR, i] = i>=start ? a[FNR, i]+$i  :  $i }END{ for(j=1; j<=FNR; j++){ s = "";  for(i=1; i<=NF; i++){ s = (s ? s OFS:"")((j,i) in a ? a[j,i] : "") } print s }  }' f1 f2
1 0 3

2 3 10

3 6 2

4 1 3

5 2 5

更好的可读性

变量start决定从哪一列开始求和,假设你设置为2它将从所有文件中的column2,column3 ......开始求和,依此类推,因为你有相等的字段和行,它运作良好

awk -v start=3 '
              NF{
                   for(i=1; i<=NF; i++) 
                       a[FNR, i] = i>=start ? a[FNR, i]+$i : $i 
                }
             END{ 
                   for(j=1; j<=FNR; j++)
                   { 
                       s = "";  
                       for(i=1; i<=NF; i++)
                       { 
                         s = (s ? s OFS:"")((j,i) in a ? a[j,i] : "") 
                       } 
                       print s 
                   }  
                }
               ' f1 f2