配列の使用awk

配列の使用awk

次の列を含む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>1awkヘッダー(最初の行)が無視されることを意味します。

同様に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

おすすめ記事