AWK를 사용하여 블록당 두 개의 열을 합산합니다.

AWK를 사용하여 블록당 두 개의 열을 합산합니다.

awk의 각 청크/("팀")에 대해 $4와 $5의 다이제스트를 계산하고 싶습니다.

입력 예:

ABC Team
1109;BB; EE;B;M
1108;GG; KK;B;M
1104;KK; CC;F;S
1103;LL; JJ;B;XL

CBS Team
600;AA; AA;O;
597;AA; MM;O;
599;BB; JJ;B;M
593;DD; SS;B;S

UMG Team
7341;BB; TT;F;M
7339;FF; AA;B;M
7338;FF; SS;B;M
7336;GG; UU;B;XL

원하는 출력

ABC Team
1109;BB; EE;B;M
1108;GG; KK;B;M
1104;KK; CC;F;S
1103;LL; JJ;B;XL
B;M = 2
B;XL = 1
F;S = 2

CBS Team
600;AA; AA;O;
597;AA; MM;O;
599;BB; JJ;B;M
593;DD; SS;B;S
O;  = 2
B;M = 1
B;S = 1

UMG Team
7341;BB; TT;F;M
7339;FF; AA;B;M
7338;FF; SS;B;M
7336;GG; UU;B;XL
F;M = 1
B;M = 2
B;XL = 1

이것은 내가 생각해낸 코드이지만 작동하지 않거나 원하는 결과를 가져온 코드를 찾을 수 없습니다. 누구든지 도와줄 수 있나요?

awk -F; "{if(NF>3) {a[$4 $5]++}} {if(NF==0) {for (pair in a) print pair, a[pair];a=0; pair=0}}1"

편집 - 위의 코드는 명확하게 형식화되어 있습니다 gawk -o-.

{
        if (NF > 3) {
                a[$4 $5]++
        }
}

{
        if (NF == 0) {
                for (pair in a) {
                        print pair, a[pair]
                }
                a = 0
                pair = 0
        }
}

1 {
        print
}

답변1

$ cat tst.awk
BEGIN { FS=SUBSEP=";"; OFS=" = " }
NF == 0 { prt(); delete sum }
{ print }
NF > 3 { sum[$4,$5]++ }
END { prt() }

function prt(   key) {
    for ( key in sum ) {
        print key, sum[key]
    }
}

$ awk -f tst.awk file
ABC Team
1109;BB; EE;B;M
1108;GG; KK;B;M
1104;KK; CC;F;S
1103;LL; JJ;B;XL
B;XL = 1
F;S = 1
B;M = 2

CBS Team
600;AA; AA;O;
597;AA; MM;O;
599;BB; JJ;B;M
593;DD; SS;B;S
B;S = 1
O; = 2
B;M = 1

UMG Team
7341;BB; TT;F;M
7339;FF; AA;B;M
7338;FF; SS;B;M
7336;GG; UU;B;XL
B;XL = 1
F;M = 1
B;M = 2

최소한 먼저 여러 줄과 들여쓰기를 사용하여 코드를 작성하고 가급적이면 파일에 저장하세요. 이렇게 하면 운영 체제 관련 인용 문제와 환경 변수 사용 시 버그를 피할 수 있고 진행하면서 이해하고 디버그하는 것이 더 쉬워집니다. 작동하도록 노력하고 있습니다. 유용하다고 생각되면 작동 후 모든 내용을 한 줄로 작성하십시오.

관련 정보