从文件生成频率表

时间:2011-05-18 12:19:21

标签: bash file shell awk

如果输入文件每行包含一个单独的数字,我如何计算该文件中该项目发生的次数?

cat input.txt
1
2
1
3
1
0

期望的输出(=> [1,3,1,1]):

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

如果解决方案也可以扩展为浮动数字,那将会很棒。

7 个答案:

答案 0 :(得分:78)

您的意思是您想要计算项目在输入文件中出现的次数?首先对它进行排序(如果输入始终是数字,请使用-n),然后计算唯一结果。

sort -n input.txt | uniq -c

答案 1 :(得分:10)

另一种选择:

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

答案 2 :(得分:1)

至少有一部分可以用

完成
sort output.txt | uniq -c

但顺序number count正好相反。这将解决这个问题。

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

答案 3 :(得分:1)

除了其他答案,您还可以use awk to make a simple graph。 (但是,再次,它不是直方图。)

答案 4 :(得分:1)

使用 Debian stda包中的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

答案 5 :(得分:0)

...
    foreach (ManagementObject mo in mySearcher.Get()) using(mo)
...

使用perl -lne '$h{$_}++; END{for $n (sort keys %h) {print "$n\t$h{$n}"}}' input.txt 来循环每一行 每个-n个数字都会增加哈希值$_ 到达%h END后, 哈希数字input.txt 打印号码sort {$a <=> $b}和频率$n

适用于浮点的类似代码:

$h{$n}

float.txt

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

输出:

1.732
2.236
1.442
3.162
1.260
0.707

答案 6 :(得分:0)

我遇到了与描述类似的问题,但跨越了数 GB 的 gzip 日志文件。由于其中许多解决方案需要等到所有数据都解析完毕,因此我选择编写 rare 以根据正则表达式快速解析和聚合数据。

在上面的例子中,就像将数据传递给直方图函数一样简单:

rare histo input.txt
# OR
cat input.txt | rare histo

# Outputs:
1                   3         
0                   1         
2                   1         
3                   1

但它也可以通过正则表达式/表达式处理更复杂的情况,例如:

rare histo --match "(\d+)" --extract "{1}" input.txt