当第二列中的字符串重复时,从一列汇总

时间:2013-06-20 20:32:59

标签: bash awk

我正试图想办法在第二列的字符串重复时对一列的数字求和。

我的文件如下:

0.35    Scer|ChrIX|ref|NC_001141.1|
0.21    Scer|ChrIX|ref|NC_001141.1|
0.40    Scer|ChrIX|ref|NC_001141.1|
0.27    Scer|ChrIX|ref|NC_001141.1|
0.26    Scer|ChrIX|ref|NC_001141.1|
0.20    Scer|ChrIX|ref|NC_001141.1|
1.22    Scer|ChrI|ref|NC_001133.7|
0.08    Scer|ChrI|ref|NC_001133.7|
0.55    Scer|ChrVIII|ref|NC_001140.5|
0.07    Scer|ChrVIII|ref|NC_001140.5|
0.17    Scer|ChrVIII|ref|NC_001140.5|

我想要一个输出文件,其中包含第二列的名称,以及该特定字符串的第一列的值的总和:

Scer|ChrIX|ref|NC_001141.1|
1.69
Scer|ChrI|ref|NC_001133.7|
1.30
Scer|ChrVIII|ref|NC_001140.5|
0.79

我猜这是awk可行但我无法找到正确的答案,也没有在论坛中找到它

非常感谢您提前

1 个答案:

答案 0 :(得分:3)

使用awk

awk '{a[$NF]+=$1}END{for(x in a) printf "%s\n%4.2f\n",x,a[x]}' file

使用您的样本数据输出:

$ awk '{a[$NF]+=$1}END{for(x in a) printf "%s\n%4.2f\n",x,a[x]}' file
Scer|ChrVIII|ref|NC_001140.5|
0.79
Scer|ChrIX|ref|NC_001141.1|
1.69
Scer|ChrI|ref|NC_001133.7|
1.30

如果按顺序需要输出:

awk 'seen==$2 { cnt+=$1 ; next }
     flag     { printf "%s\n%4.2f\n", seen,cnt ; flag=0 }
              { seen=$2 ; cnt=$1 ; flag=1 }
     END      { printf "%s\n%4.2f\n", seen,cnt}
' file