【问题标题】:How to print number of occurances of a word in a file in unix如何在unix中打印文件中单词的出现次数
【发布时间】:2015-01-08 01:33:25
【问题描述】:

这是我的 shell 脚本。 给定一个目录和一个单词,搜索目录并打印该单词出现次数最多的文件的绝对路径,并打印出现次数。 我写了以下脚本

#!/bin/bash

 if [[ -n $(find / -type d -name $1 2> /dev/null) ]]
 then
  echo "Directory exists"

   x=` echo " $(find / -type d -name $1 2> /dev/null)"`
   echo "$x"
   cd $x
   y=$(find . -type f | xargs grep -c  $2  | grep -v ":0"| grep -o '[^/]*$' | sort -t: -k2,1 -n -r ) 
   echo "$y"
   else 
   echo "Directory does does not exists"
 fi   


 result: scriptname directoryname word
 output: /somedirectory/vtb/wordsearch : 4
         /foo/bar: 3

有没有替代 xargs grep -c $2 的选项?因为 grep -c 打印包含该单词的计数=行数,但我需要打印给定目录中文件中单词的确切出现

【问题讨论】:

  • 运行 find 命令两次是错误的。 x=`echo "$(find ...)"` 可以是 x=$(find ...)。对于带有空格或其他特殊字符的文件,像这样抓取 find 的输出是不安全的。
  • 如果我删除它不起作用
  • 怎么样?包装 echo 和额外的子外壳没有做任何事情。

标签: shell unix


【解决方案1】:

使用 grep 的 -c 计数功能:

grep -c "SEARCH" /path/to/files* | sort -r -t : -k 2 | head -n 1

grep 命令将以/path/name:count 格式输出每个文件,排序将按数字(-n)按冒号(-t :)分隔的第二个(-k 2)字段以相反的顺序( -r)。然后我们使用 head 来保留第一个结果 (-n 1)。

【讨论】:

  • 它是否递归地搜索当前目录中包含给定单词的文件?因为我没有为文件指定任何路径。抱歉,我在家时无法运行命令并检查,所以想澄清我的疑问
  • grep -c 仅计算包含该模式的 ,如果每行出现多次,则不计算所有出现的模式。
【解决方案2】:

试试这个:

grep -o -w 'foo' bar.txt | wc -w

grep -o -w 'word' /path/to/file/ | wc -w

【讨论】:

  • 这仅打印给定文件中单词出现的次数。但我需要打印文件名和计数。
【解决方案3】:
grep -Fwor "$word" "$dir" | sed "s/:${word}\$//" | sort | uniq -c | sort -n | tail -1

【讨论】:

  • sed 在做什么,我不知道 {word} 是什么意思
  • grep -o -r 输出文件名、冒号和您要查找的单词。 sed 删除了冒号和单词——我不是假设每个文件名都没有冒号。
猜你喜欢
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多