awk或sed对行中的类似值求和

ctf*_*tfd 0 bash awk sed

我有一个文件的值如下:

(X1 55) (X2 99) (X3 29) (X1 3) (X3 10)
(X1 21) (X3 11) (X1 9)
Run Code Online (Sandbox Code Playgroud)

有没有办法Xn按每行中的名称添加值:

(X1 58) (X2 99) (X3 39)
(X1 30) (X3 11)
Run Code Online (Sandbox Code Playgroud)

我不确定哪个最好用,awk,sed或......?我试过这个:

awk '{for (i=t=0;i<NF;) t+=$++i; $0=t}1' file

196
41
Run Code Online (Sandbox Code Playgroud)

它显然将所有值加在一起,所以也许它有点复杂.

Ed *_*ton 6

$ awk '{
    for (i=1;i<NF;i+=2) {
        sum[$i]+=$(i+1)
    }
    ofs = ""
    for (key in sum) {
        printf "%s%s %d)", ofs, key, sum[key]
        delete sum[key]
        ofs = OFS
    }
    print ""
}' file
(X2 99) (X3 39) (X1 58)
(X3 11) (X1 30)
Run Code Online (Sandbox Code Playgroud)

如果您关心字段的顺序,有多种方法可以保留原始订单...

  • @Floris我会帮你的. (3认同)