csv列の合計値

csv列の合計値

各列の値を合計して列ヘッダーを置き換える必要があるいくつかの非常に大きなcsvファイルがあります。

例CSV:

col1,col2,col3
enabled,disabled,active
disabled,disabled,enabled
N/A,enabled,active
enabled,N/A,disabled

希望の出力:

col1,2 enabled,1 disabled,1 N/A
col2,1 enabled,2 disabled,1 N/A
col3,1 enabled,1 disabled,2 active

実際のcsvにはより多くの列と行があるので、ファイルを自動的に繰り返すことができれば良いでしょう。一度に1列ずつ実行するawkプログラムのハッキングを考えることもできますが、ファイル全体を一度に処理でき、どこから始めるべきかわからないことを好みます。出力は、私が含めた正確な形式である必要はありませんが、少なくとも似ている必要があります。

ベストアンサー1

$ cat tst.awk
BEGIN { FS=OFS="," }
NR==1 { numRows = split($0,keys); next }
{
    for (i=1; i<=NF; i++) {
        sum[i,$i]++
        vals[$i]
    }
}
END {
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        printf "%s", keys[rowNr]
        for (val in vals) {
            printf "%s%d %s", OFS, sum[rowNr,val], val
        }
        print ""
    }
}

$ awk -f tst.awk file
col1,1 disabled,2 enabled,1 N/A,0 active
col2,2 disabled,1 enabled,1 N/A,0 active
col3,1 disabled,1 enabled,0 N/A,2 active

それとももっと役に立つかもしれません:

$ cat tst.awk
BEGIN { FS=OFS="," }
NR==1 { numRows = split($0,keys); next }
{
    for (i=1; i<=NF; i++) {
        sum[i,$i]++
        vals[$i]
    }
}
END {
    printf "%s", "key"
    for (val in vals) {
        printf "%s%s", OFS, val
    }
    print ""

    for (rowNr=1; rowNr<=numRows; rowNr++) {
        printf "%s", keys[rowNr]
        for (val in vals) {
            printf "%s%d", OFS, sum[rowNr,val]
        }
        print ""
    }
}

$ awk -f tst.awk file
key,disabled,enabled,N/A,active
col1,1,2,1,0
col2,2,1,1,0
col3,1,1,0,2

おすすめ記事