需要根据管道分隔符对最后一列求和

Gan*_*esh 3 awk shell-script

我有以下输入,其中包含大量行

11|ABCD|19900101123123445455|555|AAA|50505050|0000009030
11|ABCD|19900101123123445455|555|AAA|50505050|0000000199
13|ABCD|201803010YYY66666666|600|ETC|20180300|0000084099
11|ABCD|19900101123123445455|555|AAA|50505050|0008995001
Run Code Online (Sandbox Code Playgroud)

我需要低于输出

11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|84099
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用以下 awk,但对数组的了解太有限。

cat test|awk -F"|" '{ a[$1]++;b[$2]++;c[$3]++;d[$4]++;e[$5]++;f[$6]+=$6 }; END { for (i in a); print i, f[i]}'
Run Code Online (Sandbox Code Playgroud)

我需要对第 6 列的最后一列求和并打印所有前 5 列,这些列由管道分隔,最后 6 列作为第 6 列的总和。

αғs*_*нιη 9

使用GNU datamash命令:

$ datamash -t'|' -s -g 1,2,3,4,5,6 sum 7 < infile
11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|8409
Run Code Online (Sandbox Code Playgroud)

在 中datamash v1.2+,您还可以指定列范围。

$ datamash -t'|' -s -g 1-6 sum 7 < infile
Run Code Online (Sandbox Code Playgroud)

或者最短的AWK替代方案,并且您有N列,您不应该一一指定所有列:

awk -F'|' '{x=$NF;NF--; a[$0]+=x} END{for(i in a) print i, a[i]}' OFS='|' infile
Run Code Online (Sandbox Code Playgroud)


Rom*_*est 5

Awk 解决方案:

awk 'BEGIN{ FS=OFS="|" }
     { a[$1 FS $2 FS $3 FS $4 FS $5 FS $6] += $7 }
     END{ for (i in a) print i, a[i] }' file
Run Code Online (Sandbox Code Playgroud)

输出:

11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|84099
Run Code Online (Sandbox Code Playgroud)