web-dev-qa-db-ja.com

ファイルから頻度表を生成する

1行に1つの数字を含む入力ファイルがある場合、そのファイルでアイテムが発生した回数を取得するにはどうすればよいですか?

cat input.txt
1
2
1
3
1
0

必要な出力(=> [1,3,1,1]):

cat output.txt
0 1
1 3
2 1
3 1

解決策を浮動小数点数にも拡張できれば、それは素晴らしいことです。

41
Javier

入力ファイルにアイテムが表示される回数のカウントが必要ですか?最初にソートし(入力が常に例のように数字の場合は-nを使用)、一意の結果をカウントします。

sort -n input.txt | uniq -c
79
Caleb

別のオプション:

awk '{n[$1]++} END {for (i in n) print i,n[i]}' input.txt | sort -n > output.txt
10
glenn jackman

Debianstda パッケージのmaphimbuを使用:

# use 'jot' to generate 100 random numbers between 1 and 5
# and 'maphimbu' to print sorted "histogram":
jot -r 100 1 5 | maphimbu -s 1

出力:

             1                20
             2                21
             3                20
             4                21
             5                18

maphimbuは浮動小数点でも動作します:

jot -r 100.0 10 15 | numprocess /%10/ | maphimbu -s 1

出力:

             1                21
           1.1                17
           1.2                14
           1.3                18
           1.4                11
           1.5                19
1
agc

少なくともそのいくつかは

sort output.txt | uniq -c

しかし、注文number countは逆になります。これはその問題を解決します。

sort test.dat | uniq -c | awk '{print $2, $1}'
1
pavium

他の答えに加えて、 awkを使用して単純なグラフを作成する ができます。 (ただし、これもヒストグラムではありません。)

Perl -lne '$h{$_}++; END{for $n (sort keys %h) {print "$n\t$h{$n}"}}' input.txt

-nで各行をループします
$_数値はハッシュを増分します%h
input.txtENDに到達すると、
sort {$a <=> $b}ハッシュを数値的に
数字$nおよび頻度$h{$n}を印刷します

浮動小数点で動作する同様のコード:

Perl -lne '$h{int($_)}++; END{for $n (sort {$a <=> $b} keys %h) {print "$n\t$h{$n}"}}' float.txt

float.txt

1.732
2.236
1.442
3.162
1.260
0.707

出力:

0       1
1       3
2       1
3       1
0
Chris Koknat