【问题标题】:In linux bourne shell: How to count the occurrences of a specific word in a file在 linux bourne shell 中:如何计算文件中特定单词的出现次数
【发布时间】:2012-05-15 00:38:26
【问题描述】:

单词是指任何以空格分隔的字符串。

假设文件test.txt 有以下由空格分隔的单词:

hello hello hello hell osd
hello
hello 
hello
hellojames beroo helloooohellool axnber hello
way
how 

我想统计每行出现hello这个词的次数。

我使用命令awk -F "hello" '{print NF-1}' test.txt 来显示每行中hello这个词的出现次数:

3
1
1
1
4
0
0

所以它总共找到 3+1+1+1+4 = 10 次出现。

问题出在第四行:hello 仅作为一个单独的词出现 1 次; hellojameshelloooohellool 等词不应计入,因为 hello 不使用空格分隔。

所以我希望它找到 7 个出现的 hello 作为单独的词。

你能帮我写一个总共返回正确 7 次的命令吗?

【问题讨论】:

  • 您需要每行出现的次数,还是只需要总数?

标签: shell unix awk grep


【解决方案1】:
awk '{ for(i=1; i<=NF; i++) if($i=="hello") c++ } END{ print c }' file.txt

如果你需要它来打印每一行:

awk '{ c=1; for(i=0; i<=NF; i++) if($i=="hello") c++; print c }'

【讨论】:

  • 其实第三行,在这个“hello”之后,这个hello后面有一个隐藏的空白,所以我算了一下,hello[space] nextline,意思是这个hello[space ] 而不是一个“你好”这个词它有效,谢谢
  • 对不起,一个接一个;字段为 1-NF。不知道为什么你的第三行是关闭的,也许你有一个有趣的非打印字符。
【解决方案2】:
grep -o '\<hello\>' filename | wc -l

\&lt;\&gt; 位是字边界模式,因此表达式找不到 foohellohellobar

你也可以使用awk -F '\\&lt;hello\\&gt;' ...来达到同样的效果。

【讨论】:

    【解决方案3】:

    解决方案:

    sed 's/\s\+/\n/g' test.txt | grep -w hello  | wc -l
    

    说明:

    sed 's/\s\+/\n/g' text.txt
    

    这会用换行符替换每个空格,有效地重新格式化文件test.txt,使其每行一个单词。命令sed 's/FIND/REPLACE/g'FIND 模式替换为REPLACE 在它出现的任何地方。模式\s\+ 表示“一个或多个空白字符”,\n 是换行符。

    grep -w hello
    

    这只会提取那些包含hello 的行作为一个完整的单词。

    wc -l
    

    这会计算行数。


    如果要计算每行出现的次数,可以使用相同的技术,但一次处理一行:

    while read line; do
      echo $line | sed 's/\s\+/\n/g' | grep -w hello  | wc -l
    done < test.txt
    

    【讨论】:

      【解决方案4】:
      for word in `cat test.txt`; do
        if [[ ${word} == hello ]]; then
          helloCount=$(( ${helloCount} + 1));
        fi;
      done;
      
      echo ${helloCount} 
      

      【讨论】:

      • UUoC! partmaps.org/era/unix/award.html(还有 UUo${},但我还没有找到相关的网站。):-)
      • 那行不通。他想要计数每行。这复制了grep -c 的行为(即它对每个文件进行计数)。
      • @AdamLiss 这不是 UUoC。需要 Cat 才能使 for 循环正常工作。他本质上是想阅读该文件以使其变得粗壮,您的链接明确指出这是对 cat 的有效使用。
      • @AdamLiss 哇!我忘记了那个语法。触摸好先生。触摸。
      • ((helloCount += 1))((helloCount++))
      【解决方案5】:
      a=$(printf "\01")
      b=hello
      sed -e "s/\<$b\>/ $a /g" -e "s/[^$a]//g" -e "s/$a/ $b /g" file | wc -w
      

      【讨论】:

        【解决方案6】:
        cat $FileName | tr '[\040]' '[\012]' | grep $word | wc -l
        

        此命令将更改新行中的空格,然后您可以轻松地 grep 该单词并计算包含给定单词的行数。

        【讨论】:

          【解决方案7】:

          只换“针”和“锉”

          #!/usr/bin/env sh
          
          needle="|"
          file="file_example.txt"
          
          IFS=$'\n'
          
          counter=0
          for line in `cat $file`
          do
              counter=$[$counter+1]
              echo $counter"|"`echo $line | grep -o "$needle" | wc -l`
          done
          

          它将打印行号和出现次数,用竖线字符分隔

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-04
            相关资源
            最近更新 更多