다음 형식의 큰 파일이 있습니다.
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
나는에 따라 파일을 정렬 할 수 있어요 열이 와 awk
또는 sort
과 함께 마지막 열 합계 awk
하지만 개별 라인하지 두 라인, 열이 일치.
답변
나는 이것을 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 :
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
답변
어쩌면 이것이 도움이 될 수 있지만 열 1은 항상 2이며 결과는 그것에 달려 있습니까?
awk '{ map[$2] += $3 + $4; } END { for (i in map) { print "2", i, map[i] | "sort -t't'" } }' file
또는 정렬에 대한 의견에서 glenn jackman이 언급 한 바와 같이 :
gawk '{ map[$2] += $3 + $4; } END { PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in map) { print 2, i, map[i] } }' file
답변
데이터를 미리 정렬하고 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
).
답변
스위스 군용 칼 유틸리티 사용 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'
필드 3 과 4 의 합인 새로운 5 번째 필드를 만듭니다 . -
stats1
기능 (또는 ” 동사 “)보다 작은 만능이며
중 큰 만능 내의mlr
같은 여러 누산기 기반 함수로,sum
,count
,mean
, 등stats1 -g 1,2
컬럼 그룹으로 데이터 1 과 2 , 그리고-f 5
그 다음 그 그룹의 필드 합계 5 .
-a sumstats1
명명 된 필드 만 인쇄합니다.