BASH:AWKはCSVを目的のテーブルに転送します。

BASH:AWKはCSVを目的のテーブルに転送します。

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

おすすめ記事