使用 bash 合并每列中具有相同名称的行

Combine rows with the same name in each column using bash

我有一个如下所示的文件(但有 52 列和 4,000 行):

                   1NA2  1NB2  2RA2  2RB2
Vibrionaceae       0.22  0.25  0.36  1.02
Bacillaceae        2.0   1.76  0.55  0.23
Enterobacteriaceae 0.55  0.52  2.40  1.23
Vibrionaceae       0.22  0.25  0.36  1.02
Bacillaceae        2.0   1.76  0.55  0.23
Enterobacteriaceae 0.55  0.52  2.40  1.23

我希望它看起来像这样:

                   1NA2  1NB2  2RA2  2RB2
Vibrionaceae       0.44  0.50  0.72  2.04
Bacillaceae        4.0   3.52  1.10  0.46
Enterobacteriaceae 1.10  1.04  4.80  2.46

编辑:对不起,我不想删除剩余的行和列。每行名称重复多次,所以我希望它只出现 1 次,每列中的总数。 我尝试了以下方法:

awk '{a[]+=}END{for(i in a) print i,a[i]}' file

但它只对第一列有效,我希望它适用于所有 52 列。

使用 GNU awk 和二维数组:

awk 'NR==1
     NR>1{
       for(i=2; i<=NF; i++){
         a[][i]+=$i
       }
     }
     END{
       for(i in a){
         printf("%-19s", i)
         for(j=2; j<=NF; j++){
           printf("%.2f  ", a[i][j])
         }
         print ""
       }
     }' file

或单行:

awk 'NR==1; NR>1{for(i=2; i<=NF; i++){a[][i]+=$i}} END{for(i in a){printf("%-19s", i); for(j in a[i]){printf("%.2f  ", a[i][j])} print ""}}' file

输出:

                   1NA2  1NB2  2RA2  2RB2
Bacillaceae        4.00  3.52  1.10  0.46  
Vibrionaceae       0.44  0.50  0.72  2.04  
Enterobacteriaceae 1.10  1.04  4.80  2.46

NR is the line number

NF is the number of fields in a row