AWKを使用して、ブロックごとに2つの列を合計します。

AWKを使用して、ブロックごとに2つの列を合計します。

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

少なくとも最初に複数行とインデントを使用してコードを記述し、可能であればファイルに保存します。これにより、オペレーティングシステムに関連する引用の問題や環境変数を使用する際のバグを回避でき、進行中の理解とデバッグが容易になります。動作しようとしています。役に立つと思われる場合は、操作後にすべての内容を1行にしてください。

おすすめ記事