awk を使用して、行の残りの部分に基づいて最初の列の値を合計します。

awk を使用して、行の残りの部分に基づいて最初の列の値を合計します。

複数の重複行を持つファイルがあり、最初の列のみが異なります。

ソースファイル:

2 A 3 rr 44 5 t y uuu 8
3 A 3 rr 44 5 t y uuu 8
0 B f 1
1 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
5 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
5 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
3 D tt v 44 f1 p
1 D tt v 44 f1 p

私が望むのは、重複を排除して最初の列の値を合計することです。

希望の出力:

5 A 3 rr 44 5 t y uuu 8
0 B f 1
11 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
4 D tt v 44 f1 p

このスクリプトは私がやろうとしているものと非常によく似ています。

awk  '{a[$2]+=$1}END{for(i in a)print a[i] , i |"sort"}' file

次の出力を提供します。

5 A 
0 B 
11 C 
4 D 

このスクリプトの最初の列を除くすべての列に$ 2を変更する方法はありますか?

ベストアンサー1

これは機能しますが、行の順序を維持しません。

awk '{v=$1; $1=""; s[$0]=s[$0]+v} END {for (r in s) { printf "%s%s\n",s[r],r }}' file
  • 最初のフィールドを変数に保存してから消去します。
  • (空白)行を含む配列を$1キーとして保存し、保存された合計を$1値として保存します。
  • 最後に配列を印刷します。printf削除することはできず、空になっているので、余分なスペースを避けるために使用します$1

| sort -k22番目の列を並べ替えるには、追加してください。

出力:

5 A 3 rr 44 5 t y uuu 8
0 B f 1
11 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5 4 t rr 33
4 D tt v 44 f1 p

おすすめ記事