パイプ区切り文字に基づいて最後の列を合計する必要があります。

パイプ区切り文字に基づいて最後の列を合計する必要があります。

私の入力にはたくさんの行があります。

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

以下の出力を取得する必要があります

11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|84099

私は以下で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]}'

6列の最後の列を合計し、パイプで区切られた最初の5列をすべて印刷し、最後の6列を6列の合計として印刷する必要があります。

ベストアンサー1

そして牛に似た一種の栄養 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

存在するdatamash v1.2+、列の範囲を指定することもできます。

$ datamash -t'|' -s -g 1-6 sum 7 < infile

または最短AWK代替案と現在地窒素列の場合は、すべての列を1つずつ指定しないでください。

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

おすすめ記事