일치하는 필드를 기준으로 열 합계

일치하는 필드를 기준으로 열 합계

다음 형식의 대용량 파일이 있습니다.

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열awkOR을 사용 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}.$2p!=$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

노트:

  • --nidxmlr숫자 필드 이름을 사용 하도록 지시합니다 .

  • put '$5=$3+$4'새로 만들기다섯 번째 장소필드, 필드의 합계그리고4.

  • 함수 stats1(또는 "동사
    ")는 더 큰 Swiss Army Knives 중 더 작은 Swiss Army Knife이며 , , , , mlr등 다양한 누산기 기반 기능을 갖추고 있습니다.sumcountmean등.

    stats1 -g 1,2열별로 데이터 그룹화1그리고2-f 5 -a sum을 클릭한 다음 해당 그룹의 필드를 추가하세요 .5. stats1 명명된 필드만 인쇄합니다.

관련 정보