2011-05-18 74 views
38

给定一个输入文件每行包含一个单独的数字,我怎么能得到一个项目在该文件中发生了多少次?从文件生成直方图

cat input.txt 
1 
2 
1 
3 
1 
0 

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

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

这将是巨大,如果溶液还可以被扩展为浮点数。

+2

这种输出的是简单实用,但它不是一个直方图。例如,请参阅http://quarknet.fnal.gov/toolkits/ati/histograms.html – 2011-05-20 00:07:24

回答

69

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

sort -n input.txt | uniq -c 
+2

我对'uniq'命令不了解。我将其更改为'cat input.txt | sort -n | uniq -c | awk'{print $ 2“”$ 1}'',现在我正在获得所需的输出。 – Javier 2011-05-18 12:29:50

+6

您使用awk获得订购是好的,但您不需要在那里使用cat。你应该学习'<'操作符来将文件输入到程序中,甚至像循环结构一样。有关幽默的价值,请参阅[猫的无用奖励](http://partmaps.org/era/unix/award.html#cat) – Caleb 2011-05-18 12:34:22

0

中的至少一部分可以与

sort output.txt | uniq -c 

进行,但顺序number count是相反的。这将解决这个问题。

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

如果第一列中的项目长度不同,则会扰乱对齐a因此,当您对列重新排序时,您可以使用选项卡而不是默认空间:'sort test.dat | uniq -c | awk'{print $ 2'\ t“$ 1}'' – PeterVermont 2013-12-04 20:13:55

10

另一种选择:

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

@Javier,'n'数组只是保留了它在输入文件中看到的字符串的计数。它可以是int,float或任何任意字符串。是的,在输入文件被完全读取后执行'END'部分。您不需要在awk中初始化变量:未初始化的变量被认为是零或空字符串(取决于上下文)。在这种情况下,'i'是一个循环变量。我认为默认的“排序”行为是考虑整条线。这个解决方案将适用于输入文件中的任何内容:awk数组是关联数组。 – 2011-05-18 14:04:28

+1

感谢illutrasting基于awk的解决方案。根据我的理解,在第一部分中,考虑到“$ 1”列中的元素,将“直方图”存储到“n”数组中。 'END'部分意味着它将在'直方图建立后'完成,对吧?是不是有必要在'awk'中初始化变量'i'作为循环?然后,'sort -n'将只应用于输出的第一列:'i,n [i]',对不对?即不在'n [i]'上?此外,这种解决方案只适用于“整数”数字(因为数组索引)? – Javier 2011-05-18 14:12:05

+0

感谢您的明确解释! – Javier 2011-05-18 14:13:38

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

遍历与-n
每个$_号的每一行递增哈希%h
一旦的input.txtEND已经达成,
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 
0

使用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