파이프 구분 기호를 기준으로 마지막 열을 합산해야 합니다.

파이프 구분 기호를 기준으로 마지막 열을 합산해야 합니다.

내 입력에 많은 줄이 있습니다.

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대안 및 현재 위치질소열의 경우 모든 열을 하나씩 지정하면 안 됩니다.

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

답변2

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

산출:

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

답변3

아이디어는 정확하지만 이와 같은 요구 사항의 경우 마지막 열을 제외한 값으로 해시 키를 만들고 해당 키를 사용하여 마지막 열의 값을 합산합니다. 절의 모든 행이 처리되면 END합계 값을 인쇄합니다.

awk '
     BEGIN {FS=OFS="|"} {
         hashKey = ""
         for(i=1;i<=(NF-1); i++) {
             hashKey = ( hashKey ? (hashKey FS $i):$i )
         }
         total[hashKey]+=$NF
     }
     END { for ( j in total ) print j, total[j] }
' file

답변4

그리고 펄

perl -lne '
    $sum{$1} += $2 if /(.*)\|(.*)/
 } END {
    print "$_|$sum{$_}" for keys %sum
' file

관련 정보