ファイルの一意の行数を取得するには?

ファイルの一意の行数を取得するには?

列 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

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

関連情報