1

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

我的文件如下所示:

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但我无法得出正确的答案,也无法在论坛中找到它

非常感谢您提前

4

1 回答 1

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
于 2013-06-20T20:35:44.330 回答