web-dev-qa-db-ja.com

ファイルの最初の列での発生をカウントする

このファイルがあります:

1 2 
1 3
1 2
3 3
52 1
52 300

そして1000以上。

各値が最初の列に出現する回数を数えたいです。

1  3 
3  1
52 2

これは、1を3回見たことを意味します。

Perl、AWK、またはBashでそれを行うにはどうすればよいですか?

9
Arash

入力がソートされている場合は、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
12
Thor