給定一個輸入文件每行包含一個單獨的數字,我怎麼能得到一個項目在該文件中發生了多少次?從文件生成直方圖
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