给定一个输入文件,每行包含一个数字,我如何计算该项目在该文件中出现的次数?
cat input.txt
1
2
1
3
1
0
期望输出 (=>[1,3,1,1]):
cat output.txt
0 1
1 3
2 1
3 1
如果解决方案也可以扩展到浮点数,那就太好了。
您的意思是您想要计算项目在输入文件中出现的次数?首先对其进行排序(如果输入始终是数字,则使用 -n
,如您的示例中所示),然后计算唯一结果。
sort -n input.txt | uniq -c
另一种选择:
awk '{n[$1]++} END {for (i in n) print i,n[i]}' input.txt | sort -n > output.txt
至少其中一些可以用
sort output.txt | uniq -c
但number count
顺序颠倒了。这将解决这个问题。
sort test.dat | uniq -c | awk '{print $2, $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
除了其他答案之外,您还可以使用 awk 制作一个简单的图表。(但是,同样,它不是直方图。
perl -lne '$h{$_}++; END{for $n (sort keys %h) {print "$nt$h{$n}"}}' input.txt
用-n
遍历每行每个$_
数字都会递增哈希%h
一旦达到input.txt
END
,
以数字方式sort {$a <=> $b}
哈希打印数字$n
和频率$h{$n}
适用于浮点数的类似代码:
perl -lne '$h{int($_)}++; END{for $n (sort {$a <=> $b} keys %h) {print "$nt$h{$n}"}}' float.txt
浮子.txt
1.732
2.236
1.442
3.162
1.260
0.707
输出:
0 1
1 3
2 1
3 1
我遇到了与描述类似的问题,但跨越千兆字节的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