Bash 计算多个文件中每三列的总和

Bash 计算多个文件中每三列的总和,bash,awk,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{u a[FNR]=$3;}NR=FNR{$3+=_a[FNR];print;}文件* 工作

我有许多文件,其中有三列,格式如下:

 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{u a[FNR]=$3;}NR=FNR{$3+=_a[FNR];print;}文件*
工作完美我通过谷歌找到了这个解决方案。如何在多个文件上更改它?

因为每个文件的前两列相同:

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用于第一列和第二列的值
最后,我们打印数组a和b的内容,因为每个文件中的前两列相同:

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用于第一列和第二列的值 最后,我们打印数组a和b的内容,您只需要:

awk '{sum[FNR]+=$3} ARGIND==(ARGC-1){print $1, $2, sum[FNR]}' file*
以上使用GNU awk表示argid。对于其他awk,只需在开始处添加FNR==1{argid++}。

您所需要的是:

awk '{sum[FNR]+=$3} ARGIND==(ARGC-1){print $1, $2, sum[FNR]}' file*
以上使用GNU awk表示argid。对于其他awk,只需在开始处添加FNR==1{argid++}。

file1

文件2

输出

文件1

文件2

输出


你已经用file*运行了很多文件,是的,但它只对2个文件有效,我想你已经用file*运行了很多文件,是的,但它只对2个文件有效,我想很好。非常感谢。我工作得很好。非常感谢。我^1可爱的方式,一如既往的优雅^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
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