2011-05-18 77 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