내 입력에 많은 줄이 있습니다.
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