Bash 如何编写筛选行并计算行数的shell脚本?

Bash 如何编写筛选行并计算行数的shell脚本?,bash,parsing,shell,text,scripting,Bash,Parsing,Shell,Text,Scripting,我有这样一个文本文件: Apple Orange Orange Banana Banana Orange Banana Orange Apple Orange 我希望在运行bash shell脚本后生成以下输出: Apple: 2 Orange: 5 Banana: 3 如果我使用Java/C++等成熟的语言,这是非常标准的东西,但是使用shell脚本/命令行最快的方法是什么?排序文件名| uniq-C | awk'{print$2:“$1}” 我会给你 2 Apple 3 Banana 5

我有这样一个文本文件:

Apple
Orange
Orange
Banana
Banana
Orange
Banana
Orange
Apple
Orange
我希望在运行bash shell脚本后生成以下输出:

Apple: 2
Orange: 5
Banana: 3

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

排序文件名| uniq-C | awk'{print$2:“$1}”

我会给你

2 Apple
3 Banana
5 Orange
这将按照指定的方式对其进行格式化。您也可以在排序的末尾添加“| sort”

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

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

很抱歉出现此问题。

此解决方案仅使用一个工具:awk

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

uniq
检查连续的相同行。您必须先对列表进行排序。谢谢您指出这一点。我通常已经对数据进行了排序,所以我忘记了这一点。要重新格式化,可以使用NawaMan所说的perl,或者sed:
。|sed-r的/*([0-9])+*(.*)/\2:\1/'
-r
将其切换为扩展正则表达式,替换与NawaMan的相同,没有不必要的括号)。最好同意这一点,因为用户在输出格式上很灵活。需求通常是在对话开始后商定的。我非常抱歉我给你的-1-只是一个错误点击;我立即试图修复它,但它告诉我它太旧了。@Dennis:或者将大量的网络小说(以及作者的位置信息)与水果列表结合起来,对水果流行与地区进行研究!你不好奇吗?
sort $FILE | uniq -c | perl -pe 's|[ ]*([0-9]+)[ ]*(.*)|\2: \1|'
$ awk '{count[$0]++} END {for (c in count) {print c ": " count[c]}} ' count.txt
Orange: 5
Banana: 3
Apple: 2