【问题标题】:use grep to count the number of times a word got repeated in a file使用 grep 计算一个单词在文件中重复的次数
【发布时间】:2014-01-10 21:38:30
【问题描述】:

问题是这样的:

例如,我有一个文件“a.xml”。在这个文件里面只有一行

<queue><item><cause><item>

我想知道&lt;item&gt;出现了多少次,在这个例子中是2。

但是,如果我运行:

grep -c "<item>" a.xml 

它只会给我 1,因为 grep 一旦匹配第一个 &lt;item&gt; 就会停止。

所以我的问题是如何使用一个简单的 shell/bash 命令返回 &lt;item&gt; 出现的次数?

看起来很简单,但我就是找不到好办法。有什么想法吗?

【问题讨论】:

  • 感谢大家这么快回答问题。需要指出的是,如果您在 windows 下使用 cmd 或 git bash 作为终端,那么 grep -o 选项将不起作用。让 grep -o 在 windows 下工作的方法是使用 Cygwin :)
  • 并非如此。 Gnu grep 已移植到 Win32
  • @kurumi 我在 Win7 下尝试了“Git Bash”和“命令提示符”,但是 grep -o 不起作用。我应该更新/安装 Windows 的 grep 吗?
  • 这里是 gnuwin32.sourceforge.net/packages/grep.htm‎

标签: bash shell grep


【解决方案1】:

你可以试试这样的:

grep -o "<item>" a.xml | wc -l

【讨论】:

    【解决方案2】:

    如果您只想单独计算“”,那么我喜欢 MillaresRoo 的 grep -o 解决方案。如果您希望更一般地计算项目,请考虑:

    $ sed 's/></>\n</g' a.xml | sort | uniq -c
          1 <cause>
          2 <item>
          1 <queue>
    

    或者,在命令行上显式显示输入:

    $ echo '<queue><item><cause><item>' | sed 's/></>\n</g' | sort | uniq -c
          1 <cause>
          2 <item>
          1 <queue>
    

    【讨论】:

      【解决方案3】:

      使用 awk 您可以在一个命令中完成:

      awk -F '<item>' '{print NF-1}' a.xml
      

      在线演示:http://ideone.com/vheDgq

      或获取整个文件使用的总数:

      awk -F '<item>' '{s+=NF-1}END{print s}' a.xml
      

      【讨论】:

      • 发帖前我已经测试过了。你能告诉我哪个输入不起作用吗?
      • 注意:对于多行文件,这将打印每行的项目数,而不是整个文件的总数。
      • 是的,这是真的,如果要求得到总数,这在 awk 中很容易做到,但我不确定问题中的多行聚合。
      • 为什么是NF-1? (对不起,我不熟悉 awk)@anubhava
      • NF-1 获取由&lt;item&gt; 分隔的令牌计数。如果字符串中有一个&lt;item&gt;,则会有2个标记,并且分隔符的正确计数是NF-1
      猜你喜欢
      • 2022-12-12
      • 2017-10-22
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2011-06-20
      相关资源
      最近更新 更多