给定一个输入文件每行包含一个单独的数字,我怎么能得到一个项目在该文件中发生了多少次?从文件生成直方图
cat input.txt
1
2
1
3
1
0
期望的输出(=> [1,3,1,1]):
cat output.txt
0 1
1 3
2 1
3 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
这将是巨大,如果溶液还可以被扩展为浮点数。
你的意思是你想要一个项目出现在输入文件中的次数?首先对它进行排序(如果输入始终是数字,则使用-n
),然后计算唯一结果。
sort -n input.txt | uniq -c
中的至少一部分可以与
sort output.txt | uniq -c
进行,但顺序number count
是相反的。这将解决这个问题。
sort test.dat | uniq -c | awk '{print $2, $1}'
如果第一列中的项目长度不同,则会扰乱对齐a因此,当您对列重新排序时,您可以使用选项卡而不是默认空间:'sort test.dat | uniq -c | awk'{print $ 2'\ t“$ 1}'' – PeterVermont 2013-12-04 20:13:55
另一种选择:
awk '{n[$1]++} END {for (i in n) print i,n[i]}' input.txt | sort -n > output.txt
@Javier,'n'数组只是保留了它在输入文件中看到的字符串的计数。它可以是int,float或任何任意字符串。是的,在输入文件被完全读取后执行'END'部分。您不需要在awk中初始化变量:未初始化的变量被认为是零或空字符串(取决于上下文)。在这种情况下,'i'是一个循环变量。我认为默认的“排序”行为是考虑整条线。这个解决方案将适用于输入文件中的任何内容:awk数组是关联数组。 – 2011-05-18 14:04:28
感谢illutrasting基于awk的解决方案。根据我的理解,在第一部分中,考虑到“$ 1”列中的元素,将“直方图”存储到“n”数组中。 'END'部分意味着它将在'直方图建立后'完成,对吧?是不是有必要在'awk'中初始化变量'i'作为循环?然后,'sort -n'将只应用于输出的第一列:'i,n [i]',对不对?即不在'n [i]'上?此外,这种解决方案只适用于“整数”数字(因为数组索引)? – Javier 2011-05-18 14:12:05
感谢您的明确解释! – Javier 2011-05-18 14:13:38
除了其他的答案,你可以use awk to make a simple graph。 (但是,再次,它不是一个直方图。)
perl -lne '$h{$_}++; END{for $n (sort keys %h) {print "$n\t$h{$n}"}}' input.txt
遍历与-n
每个$_
号的每一行递增哈希%h
一旦的input.txt
END
已经达成,
sort
哈希数字
打印号码$n
和频率$h{$n}
类似代码适用于浮点:
perl -lne '$h{int($_)}++; END{for $n (sort 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
使用maphimbu
从的Debianstda包:
# 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
这种输出的是简单实用,但它不是一个直方图。例如,请参阅http://quarknet.fnal.gov/toolkits/ati/histograms.html – 2011-05-20 00:07:24