各列の値を合計して列ヘッダーを置き換える必要があるいくつかの非常に大きな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