2番目の列を一意にし、その値を最初の列に追加します。

2番目の列を一意にし、その値を最初の列に追加します。

私の入力は以下の通りです。 2番目の列には一意の文字列のみを保持する必要があります。ここで、最初の列は各固有文字列のすべての値の合計になります。

たとえば、OIA2番目の列を取得し、最初の列に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 }'

関連情報