発生回数を含むCSVファイルの重複値を印刷します。

発生回数を含むCSVファイルの重複値を印刷します。

入力例は次のとおりです。

John,Yes,123
Tom,No,345
Jason,Yes,567
Thomas,No,123
Jess,No,999
James,Yes,888
Lisa,No,345
Lou,Yes,777
Peter,No,123

3列目の値の発生回数を印刷したいのですが、1回以上発生した値だけを印刷したいと思います。したがって、上記の例では、望ましい出力は次のようになります。

3 123
2 345

sed/またはこれと同様にこれをどのように実行できますかawk

答え1

cut -f3 -d, "$file" | sort | uniq -cd | sed 's/  *//'
  • cut3番目のフィールドのみを出力するには、カンマを区切り文字として使用します。
  • sortuniq使用できるように行を並べ替える
  • uniq -c-d重複行のみを出力する(つまり、一意の値を省略する)連続した重複行数を計算します。
  • 最後はsed先行スペースを削除します。

答え2

一行awk:

awk -F',' '{c[$3]++} END{for (i in c) {if (c[i]>1) print c[i],i}}' input.csv
  • この表示はフィールド区切り文字awkとして使用されます。,
  • 各行に対して、3番目のフィールド()の値のカウンタをインクリメントします$3
  • 最後に、カウンタ配列c()for (i in c)に登録されているすべての「インデックス」を繰り返し、そのインデックスに関連付けられている「アイテム」が1より大きい場合、発生回数と3番目の列の対応する値を印刷します。

出力フォーマットをより詳細に制御するには、ブロックの代わりにprintf使用することをお勧めします。printEND

関連情報