列 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
上記のコードは、キーストロークが発生した順序で印刷します。配列はキーの順序を維持しますが、ハッシュは各キーに対応する合計を保持します。