Command-Line
如何計算文件中不同字元的數量?
我需要一個程序,輸出文件中不同字元的數量。例子:
> stats testfile ' ': 207 'e': 186 'n': 102
存在任何工具,這樣做嗎?
以下應該有效:
$ sed 's/\(.\)/\1\n/g' text.txt | sort | uniq -c
首先,我們在每個字元後插入一個換行符,將每個字元放在自己的行中。然後我們對其進行排序。然後我們使用 uniq 命令刪除重複項,在每一行前面加上該字元的出現次數。
要按頻率對列表進行排序,請將其全部輸入
sort -nr
.
Steven 的解決方案很好,很簡單。由於排序步驟的原因,它對於非常大的文件(不適合放在大約一半 RAM 中的文件)的性能不是很好。這是一個 awk 版本。它也有點複雜,因為它試圖為一些特殊字元(換行符、、、、)做正確
'
的\
事情:
。awk ' {for (i=1; i<=length; i++) ++c[substr($0,i,1)]; ++c[RS]} function chr (x) {return x=="\n" ? "\\n" : x==":" ? "\\072" : x=="\\" || x=="'\''" ? "\\" x : x} END {for (x in c) printf "'\''%s'\'': %d\n", chr(x), c[x]} ' | sort -t : -k 2 -r | sed 's/\\072/:/'
這是基於相同原理的 Perl 解決方案。Perl 的優點是能夠在內部進行排序。如果文件不以換行符結尾,這也不會正確計算額外的換行符。
perl -ne ' ++$c{$_} foreach split //; END { printf "'\''%s'\'': %d\n", /[\\'\'']/ ? "\\$_" : /./ ? $_ : "\\n", $c{$_} foreach (sort {$c{$b} <=> $c{$a}} keys %c) }'