ある行の列が別の行の列と一致する場合は、次を追加します。

ある行の列が別の行の列と一致する場合は、次を追加します。

同じ表の最初の列に与えられた項目に基づいて、下の表の列にリストされている数値を合計したいと思います。表の内容は次のとおりです。

10,Mumbai,0,4,5,0,6,3,55,M
2,Mumbai,1,3,2,0,4,4,4,M
4,Chennai,5,6,7,8,9,0,6,F

予想される結果は次のとおりです(2番目と最後の列にグループ化されたデータ)。

12,Mumbai,1,7,7,0,10,7,59,M
4,Chennai,5,6,7,8,9,0,6,F

Linuxでawkを使用してこの出力を取得するにはどうすればよいですか?

ベストアンサー1

$ cat tst.sh
#!/usr/bin/env bash

awk '
    BEGIN { FS=OFS="," }
    $2 != vals[2] {
        if ( NR>1 ) {
            prt()
        }
        split($0,vals)
        next
    }
    {
        for ( i=1; i<=NF; i++ ) {
            if ( $i+0 == $i ) {
                vals[i] += $i
            }
        }
    }
    END {
        prt()
    }
    function prt(    i) {
        for (i=1; i<=NF; i++) {
            printf "%s%s", vals[i], (i<NF ? OFS : ORS)
        }
    }
' "${@:--}"

$ ./tst.sh file
12,Mumbai,1,7,7,0,10,7,59,M
4,Chennai,5,6,7,8,9,0,6,F

入力ファイルがまだ2番目のフィールドにグループ化されていない場合(公開された入力例のように)、以下を変更します。

awk '...' "${@:--}"

これに関して:

sort -t',' -k2,2 "${@:--}" | awk '...'

おすすめ記事