このファイルがあります:
1 2
1 3
1 2
3 3
52 1
52 300
そして1000以上。
各値が最初の列に出現する回数を数えたいです。
1 3
3 1
52 2
これは、1
を3回見たことを意味します。
Perl、AWK、またはBashでそれを行うにはどうすればよいですか?
入力がソートされている場合は、uniqを使用できます。
<infile cut -d' ' -f1 | uniq -c
そうでない場合は、最初に並べ替えます。
<infile cut -d' ' -f1 | sort -n | uniq -c
出力:
3 1
1 3
2 52
出力は要件と比較して入れ替えられます。awk '{ print $2, $1 }'
を使用して変更できます。
1 3
3 1
52 2
ソートされた入力を必要としないawkイディオムもあります。
awk '{h[$1]++}; END { for(k in h) print k, h[k] }'
出力:
1 3
52 2
3 1
ここでの出力は順序付けされないハッシュからのものなので、必要な場合はsort -n
に渡します。
awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n
GNU awkを使用している場合は、awk内から並べ替えを行うことができます。
awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'
最後の2つの場合の出力は次のとおりです。
1 3
3 1
52 2