入力例は次のとおりです。
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/ *//'
cut
3番目のフィールドのみを出力するには、カンマを区切り文字として使用します。sort
uniq
使用できるように行を並べ替える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
使用することをお勧めします。print
END