2009-09-21 37 views
2

我有一个文本文件是这样的:如何编写过滤行数并对它们进行计数的shell脚本?

Apple 
Orange 
Orange 
Banana 
Banana 
Orange 
Banana 
Orange 
Apple 
Orange 

我想运行一个bash shell脚本之后产生以下的输出:

​​

这是非常标准的东西,如果我用一个完全成熟的语言如Java/C++等,但用shell脚本/命令行来做到最快的方法是什么?

+0

功课,对吧? –

+0

@ Dennis:或者将大量的网络小说(包括作者的位置信息)与水果清单结合起来,对水果流行率与地区进行研究!你不好奇吗? – Cascabel

回答

13
sort $FILE | uniq -c 

会给你

2 Apple 
3 Banana 
5 Orange 
+1

和重新格式化,你可以使用perl作为NawaMan说,或sed:'... | sed -r'/ *([0-9])+ *(。*)/ \ 2:\ 1 /''('-r'将其切换为扩展正则表达式,替换与NawaMan不必要的括号)。 – Cascabel

+0

认为这是最好的,因为它就像是用户在输出格式上很灵活。对话开始后,通常需要同意这些要求。 – ericslaw

4

sort filename | uniq -c | AWK '{打印$ 2 “:” $ 1}'

+0

不需要猫! – Cascabel

+0

表示同意,不需要猫 – rangalo

+0

额外的awk会根据需要进行格式化 – rangalo

2
uniq -c $FILE | perl -pe 's|[ ]*([0-9]+)[ ]*(.*)|\2: \1|'

指定这将其格式化的方式。你可以添加'|最后排序“。

编辑:正如在评论中指出的,我对uniq做了一个错误,所以这里是正确的。

sort $FILE | uniq -c | perl -pe 's|[ ]*([0-9]+)[ ]*(.*)|\2: \1|'

对不起,对于这个问题。

+0

'uniq'检查连续相同的行。您必须首先对列表进行排序。 – Cascabel

+0

谢谢你指出。我主要习惯于已经排序的数据,所以我忘记了这一点。 – NawaMan

4

该方案仅使用一个工具:在awk

$ awk '{count[$0]++} END {for (c in count) {print c ": " count[c]}} ' count.txt 
Orange: 5 
Banana: 3 
Apple: 2 
相关问题