다음 형식의 대용량 파일이 있습니다.
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
값이 다음과 같은 경우2열일치하며 다음 값을 합산하고 싶습니다.3열그리고4두 행의 값, 그렇지 않으면 고유 행의 값 합계입니다.
그래서 내가 원하는 출력은 다음과 같습니다.
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
다음 기준에 따라 파일을 정렬할 수 있습니다.2열awk
OR을 사용 sort
하고 마지막 열의 합계를 구합니다 awk
. 단, 두 행이 아닌 단일 행에만 해당됩니다.2열성냥.
답변1
나는 Perl에서 이것을 할 것이다:
$ perl -lane '$k{"$F[0] $F[1]"}+=$F[2]+$F[3];
END{print "$_ $k{$_}" for keys(%k) }' file
2 1019 15
2 1021 4
2 1030 6
2 1031 8
2 1022 9
아니면 어이:
awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file
두 번째 열을 기준으로 출력을 정렬하려면 다음으로 파이프할 수 있습니다 sort
.
awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file | sort -k2
두 솔루션 모두 첫 번째 열을 포함합니다. 아이디어는 첫 번째와 두 번째 열을 해시(perl) 또는 연관 배열(awk)에 대한 키로 사용하는 것입니다. 각 솔루션의 핵심은 column1 column2
두 행의 두 번째 열이 동일하지만 첫 번째 열이 다른 경우 별도로 그룹화된다는 것입니다.
$ cat file
2 1019 2 3
2 1019 4 1
3 1019 2 2
$ awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file
3 1019 4
2 1019 10
답변2
아마도 이것이 도움이 될 것입니다. 그러나 열 1은 항상 2이고 결과는 이에 따라 달라집니까?
awk '{ map[$2] += $3 + $4; } END { for (i in map) { print "2", i, map[i] | "sort -t't'" } }' file
아니면 언급했듯이글렌 잭맨정렬에 대한 설명:
gawk '{ map[$2] += $3 + $4; } END { PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in map) { print 2, i, map[i] } }' file
답변3
데이터를 미리 정렬하고 awk가 세부 사항을 처리하도록 할 수 있습니다.
sort -n infile | awk 'NR>1 && p!=$2 {print p,s} {s+=$3+$4} {p=$2}'
적산계를 재설정해야 할 수도 있습니다.
sort -n infile | awk 'NR>1 && p!=$2 {print p,s;s=0} {s+=$3+$4} {p=$2}'
산출:
1019 15
1021 19
1022 28
1030 34
첫 번째 열을 유지하려면 다음을 수행하십시오.
sort -n infile | awk 'NR>1 && p!=$1FS$2 {print p,s} {s+=$3+$4} {p=$1FS$2}'
산출:
2 1019 15
2 1021 19
2 1022 28
2 1030 34
설명하다
이 p
변수는 $2
이전 행의 값( $1FS$2
위의 두 번째 경우)을 보유합니다. 즉, 현재 행이 현재 행과 다를 때 ()가 실행됩니다 {print p,s}
.$2
p!=$2
답변4
Swiss Army Knife 유틸리티 사용mlr
:
mlr --nidx put '$5=$3+$4' then stats1 -g 1,2 -f 5 -a sum infile
산출:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
노트:
--nidx
mlr
숫자 필드 이름을 사용 하도록 지시합니다 .put '$5=$3+$4'
새로 만들기다섯 번째 장소필드, 필드의 합계삼그리고4.함수
stats1
(또는 "동사
")는 더 큰 Swiss Army Knives 중 더 작은 Swiss Army Knife이며 , , , ,mlr
등 다양한 누산기 기반 기능을 갖추고 있습니다.sum
count
mean
등.stats1 -g 1,2
열별로 데이터 그룹화1그리고2-f 5 -a sum
을 클릭한 다음 해당 그룹의 필드를 추가하세요 .5.stats1
명명된 필드만 인쇄합니다.