我在第 1 列中有一个标识符列表,在第 2 列中有相应的计数。该文件如下所示:
KDO65387 65
KDO65387 27
XP_006465447 971
XP_006482015 1207
XP_003630414 194
XP_002513282 500
XP_003630414 23
我想要的是,如果连续行中的第 1 列中的值匹配,则对第 2 列中的值求和。输出将如下所示:
KDO65387 92
XP_006465447 971
XP_006482015 1207
XP_003630414 217
XP_002513282 500
答案1
如果顺序很重要:
awk '!($1 in sum) {f[n++] = $1}
{sum[$1] += $2}
END {for (i = 0; i < n; i++) print f[i], sum[f[i]]}' < file
如果没有,您可以将其简化为:
awk '{sum[$1] += $2}
END {for (f in sum) print f, sum[f]}' < file
答案2
使用datamash
:
datamash groupby 1 sum 2 <infile.txt
答案3
perl -lane '
exists $h{$F[0]} or push @h, $F[0];
$h{$F[0]} += $F[1];
END { print "$_\t$h{$_}" for @h; }
' yourfile
上面的代码将按照遇到的顺序打印按键。数组维护键的顺序,而散列维护与每个键对应的总和。