【问题标题】:Obtaining the total of coincidences with multiple pattern using grep command使用 grep 命令获取具有多个模式的重合总数
【发布时间】:2016-02-23 15:47:12
【问题描述】:

我在 Linux 中有一个文件包含字符串:

CALLTMA
Starting
Starting
Ending
Starting
Ending
Ending
CALLTMA
Ending

我需要任何字符串的数量(FE.#Ending、#Starting、#CALLTMA)。在我的示例中,我需要获取:

CALLTMA : 2
Starting: 3
Ending : 4

当我执行 3 个命令时,我可以得到这个输出:

grep -i "Starting" "/myfile.txt" | wc -l
grep -i "Ending" "/myfile.txt" | wc -l
grep -i "CALLTMA" "/myfile.txt" | wc -l

我想知道是否可以只使用一个命令获得相同的输出。

我尝试运行这个命令

grep -iE "CALLTMA|Starting|Ending" "/myfile.txt" | wc -l

但这返回了巧合的总数。感谢您的帮助。

【问题讨论】:

  • 看看uniq工具。它有一个用于计算文件中唯一项目的标志。

标签: linux bash shell grep


【解决方案1】:

使用sortuniq

sort myfile.txt | uniq -c

-c 将计数添加到唯一行。如果要按频率对输出进行排序,请添加

| sort -n

到最后(如果您想要降序,请更改为-nr)。

【讨论】:

    【解决方案2】:

    一个简单的 awk 方法来处理这个问题:

    awk '{counts[$1]++} END{for (c in counts) print c, counts[c]}' file
    
    Starting 3
    Ending 4
    CALLTMA 2
    

    【讨论】:

      【解决方案3】:

      grep -c 可以工作。您可以将它们放在一个简短的脚本中:

      for i in Starting CALLTMA Ending; do 
          printf "%-8s  : %d\n" "$i" $(grep -c "$i" file.txt)
      done
      

      (要输入搜索词作为参数,只需使用参数数组作为循环列表,例如for i in "$@"; do

      输出

      Starting  : 3
      CALLTMA   : 2
      Ending    : 4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 2021-10-21
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多