bashを使用して.csvファイルを目的のテーブル形式に変換するのが難しくなりました。
私のファイルo / p:
$ cat finalcount.csv
state,status,count
NW,CONGESTED,11
NW,CLEARED,9
ACT,CLEARED,7
ACT,CONGESTED,7
QLD,CLEARED,5
WA,CONGESTED,3
WA,CLEARED,2
VIC,CLEARED,3
VIC,CONGESTED,2
私が望むO / P:
State Congested Cleared
ACT 7 7
NW 11 9
VIC 2 3
QLD - 5
回答を共有して説明してください。
ベストアンサー1
使用ミラー:
$ mlr --icsvlite --opprint \
reshape -s status,count then unsparsify then reorder -e -f CLEARED finalcount.csv
state CONGESTED CLEARED
NW 11 9
ACT 7 7
QLD - 5
WA 3 2
VIC 2 3
GNUデータ統合列の順序を制御する簡単な方法はないようですが、ピボットテーブル(クロスタブとも呼ばれます)などの操作にも役立ちます。
datamash --header-in --filler=- -t, crosstab 1,2 unique 3 < finalcount.csv | csvformat -T
CLEARED CONGESTED
ACT 7 7
NW 9 11
QLD 5 -
VIC 3 2
WA 2 3
本当にAwkを使用する必要がある場合は、次のように動作します。
awk -F, '
NR>1 {s[$1]}
$2 == "CONGESTED" {a[$1]=$3}
$2 == "CLEARED" {b[$1]=$3}
END {
printf "state\tcongested\tcleared\n";
for (k in s)
printf "%s\t%s\t%s\n", k, a[k]=="" ? "-" : a[k], b[k]=="" ? "-" : b[k]
}
' finalcount.csv