【问题标题】:How to write shell script that filter for lines and count them?如何编写过滤行并计算它们的shell脚本?
【发布时间】:2009-09-21 21:06:03
【问题描述】:

我有一个这样的文本文件:

Apple
Orange
Orange
Banana
Banana
Orange
Banana
Orange
Apple
Orange

我想在运行 bash shell 脚本后产生以下输出:

Apple: 2
Orange: 5
Banana: 3

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

【问题讨论】:

  • @Dennis:或者将大量网络小说(带有作者位置信息)与水果列表结合起来,研究水果流行率与地区的关系!你不好奇吗?

标签: bash parsing shell text scripting


【解决方案1】:
sort $FILE | uniq -c

会给你

2 Apple
3 Banana
5 Orange

【讨论】:

  • 要重新格式化,您可以按照 NawaMan 所说使用 perl,或 sed:... | sed -r 's/ *([0-9])+ *(.*)/\2: \1/'-r 将其切换为扩展正则表达式,替换与 NawaMan 相同,没有不必要的括号) .
  • 最好同意这一点,因为用户很可能在输出格式上很灵活。要求通常在对话开始后达成一致。
【解决方案2】:

排序文件名 |唯一的-c | awk '{ print $2 ": " $1 }'

【讨论】:

  • 我对我显然给你的 -1 感到非常抱歉 - 只是点击错误;我立即尝试修复它,它告诉我它太旧了。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:
    uniq -c $FILE | perl -pe 's|[ ]*([0-9]+)[ ]*(.*)|\2: \1|'

    这会将其格式化为指定的方式。您可以添加'|排序'在最后也排序。

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

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

    很抱歉出现问题。

    【讨论】:

    • uniq 检查连续的相同行。您必须先对列表进行排序。
    • 感谢您指出这一点。我大多习惯于已经对数据进行排序,所以我忘记了。
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2021-11-28
    • 2011-06-24
    • 1970-01-01
    • 2013-10-03
    • 2020-04-27
    相关资源
    最近更新 更多