计算单词列表中每个单词出现在文件中的次数?

时间:2012-05-19 05:41:09

标签: bash grep

我有一个文件list.txt,其中包含一个单词列表。我想检查每个单词出现在另一个文件file1.txt中的次数,然后输出结果。所有数字的简单输出就足够了,因为我可以使用电子表格程序手动将它们添加到list.txt,但如果脚本在list.txt的每行末尾添加数字,那就是更好,例如:

bear 3
fish 15

我试过这个,但它不起作用:

cat list.txt | grep -c file1.txt

4 个答案:

答案 0 :(得分:9)

您可以在循环中执行此操作,该循环一次从单词列表文件中读取单个单词,然后计算数据文件中的实例。例如:

while read; do
    echo -n "$REPLY "
    fgrep -ow "$REPLY" data.txt | wc -l
done < <(sort -u word_list.txt)

“秘密酱”包括:

  1. 使用隐式REPLY变量;
  2. 使用进程替换从单词列表文件中收集单词;和
  3. 确保您正在使用数据文件中的整个单词。

答案 1 :(得分:4)

这个awk方法只需要遍历每个文件一次:

awk '
  # read the words in list.txt
  NR == FNR {count[$1]=0; next}
  # process file1.txt
  {
    for (i=0; i<=NF; i++) 
      if ($i in count)
        count[$i]++
  }
  # output the results
  END {
    for (word in count)
      print word, count[word]
  }
' list.txt file1.txt

答案 2 :(得分:3)

这可能适合你(GNU sed):

tr -s ' ' '\n' file1.txt |
sort |
uniq -c |
sed -e '1i\s|.*|& 0|' -e 's/\s*\(\S*\)\s\(\S*\)\s*/s|\\<\2\\>.*|\2 \1|/' |
sed -f - list.txt

说明:

  • file1.txt拆分为单词
  • 对单词进行排序
  • 计算单词
  • 创建一个sed脚本以匹配单词(最初将每个单词清零)
  • 针对list.txt
  • 运行上述脚本

答案 3 :(得分:1)

单行命令

cat file1.txt |tr " " "\n"|sort|uniq -c |sort -n -r -k 1 |grep -w -f list.txt 

命令的最后一部分告诉grep从列表中读取要匹配的单词(-f选项),然后匹配整个单词(-w),即如果list.txt包含car,则grep应该忽略car。

但请记住,您对整个单词和grep的观点的看法可能不同。例如。虽然汽车与马车不匹配,但它会与洗车相匹配,请注意&#34; - &#34;将被考虑用于字边界。 grep将除字母,数字和下划线之外的任何内容作为单词边界。这应该不是问题,因为这符合英语中单词的公认定义。