私の入力は以下の通りです。 2番目の列には一意の文字列のみを保持する必要があります。ここで、最初の列は各固有文字列のすべての値の合計になります。
たとえば、OIA
2番目の列を取得し、最初の列にOIAの対応する値を追加して前に印刷しますOIA
。
入力する:
1079 OIA
1079 OIA
975 OIA
975 OIA
372 CLN
243 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
予想出力:
4108 OIA
372 CLN
2483 TLN
答え1
awk '{m[$2]+=$1}END{for(i in m)print m[i],i}' file
これは、スペースを使用して列を区切るほとんどの場合にうまく機能します。
答え2
例の入力に示すように、入力が常に2番目の列値にグループ化されているとします。
$ awk '$2!=prev{if (NR>1) print sum, prev; sum=0; prev=$2} {sum+=$1} END{print sum, prev}' file
4108 OIA
372 CLN
2483 TLN
上記のコードはメモリにほとんど何も保持しないため、ランダムに大きなファイルで動作し、入力$ 2の値と同じ順序で出力を生成します。
答え3
GNUを使用して、データが2番目の列にソートされているとしますdatamash
。
datamash -W groupby 2 sum 1 <file
これは入力をスペースで区切られたフィールドとして読み取り、データを2番目のフィールドにグループ化し、各グループの最初のフィールドを合計します。
質問に提供されたデータの出力はタブで区切られます。
CLN 372
OIA 4108
TLN 2483
これらのフィールドは、質問で予想されるフィールドと置き換えられます。この問題を解決するには、2番目のフィールドの入力データも並べ替えてください(質問のようにきれいに並べ替えられない場合)。
sort -b -k 2,2 file | datamash -W groupby 2 sum 1 | awk -v OFS='\t' '{ print $2, $1 }'