次の列を含むCSVがあります。
Team Other Data More Data Result Time
Knicks A F Loss 2p
Celtics B E Win 2p
Lakers C D Loss 3p
Lakers D C Loss 4p
Knicks E B Win 4p
Lakers F A Win 5p
CSVを読み、各チームの勝敗を出力するには?
たとえば、私が望む出力は次のようになります。
1 Loss Knicks 1 Win Knicks 1 Win Celtics 2 Loss Lakers 1 Win Lakers
今、次のコードがあります。
#!/bin/bash
while IFS=, read -r team result
do
echo $team, $result
done < teams.csv
次の出力が生成されます。
Team, Result
Knicks, Loss
Celtics, Win
Lakers, Loss
Lakers, Loss
Knicks, Win
各チームの各結果の発生回数をどのように計算して保存できますか?理想的には、このデータをチームごとにソートしたいと思います。
ベストアンサー1
配列の使用awk
入力ファイルのフィールドが1つ以上のスペース文字で区切られている場合は、フィールド区切り文字を宣言する必要はありません。
awk 'NR>1 && NF { league[$1][$4]++ } END { for ( team in league ) for ( results in league[team] ) print league[team][results],results,team }' teams.txt
画面に合わせてフォーマットされた同じコード:
awk 'NR>1 && NF { league[$1][$4]++ }
END { for ( team in league )
for ( results in league[team] )
print league[team][results],results,team }' teams.txt
ここでは、リーグ(入力ファイル)の各チーム(、最初のゲーム)の勝敗(、4番目のゲーム)の数を数えますleague[$1][$4]++
。$4
$1
NR>1
awk
ヘッダー(最初の行)が無視されることを意味します。
同様にNF
、(の略語)は、1つ以上のフィールドを含む行のみをチェックすることをNF>0
意味します。awk
つまり、NF
空行をスキップします。
このNR>1 && NF
セクションでは、入力ファイルを調べて配列を作成します。完了すると、このEND
セクションでは配列を印刷します。
入力ファイルのフィールドがコンマで区切られている場合は、BEGIN { FS="," ; OFS=" " }
設定入力(FS
)および出力(OFS
)フィールド区切り文字を追加します。
awk 'BEGIN { FS="," ; OFS=" " } NR>1 && NF { league[$1][$4]++ } END { for ( team in league ) for ( results in league[team] ) print league[team][results],results,team }' teams.csv
画面に合わせてフォーマットされた同じコード:
awk 'BEGIN { FS="," ; OFS=" " }
NR>1 && NF { league[$1][$4]++ }
END { for ( team in league )
for ( results in league[team] )
print league[team][results],results,team }' teams.csv
出力:
1 Win Knicks
1 Loss Knicks
1 Win Lakers
2 Loss Lakers
1 Win Celtics
| sort -t " " -k 3 -k 2,2
そのコードの最後に追加してチームごとに並べ替え、各チームの結果で並べ替えます。
ソートされた出力:
1 Win Celtics
1 Loss Knicks
1 Win Knicks
2 Loss Lakers
1 Win Lakers