7

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

bear 3
fish 15

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

cat list.txt | grep -c file1.txt
4

4 回答 4

9

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

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

“秘方”包括:

  1. 使用隐式 REPLY 变量;
  2. 使用进程替换从单词列表文件中收集单词;和
  3. 确保您正在搜索数据文件中的整个单词。
于 2012-05-19T06:01:04.657 回答
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
于 2012-05-19T09:44:38.663 回答
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
于 2012-05-19T08:26:22.373 回答
1

单行命令

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

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

但是请记住,您对整个单词的看法和 grep 的看法可能不同。例如。虽然 car 不会与carriage 匹配,但会与 car-wash 匹配,注意单词边界会考虑“-”。grep 将除字母、数字和下划线之外的任何内容作为单词边界。这应该不是问题,因为这符合英语单词的公认定义。

于 2014-09-11T14:21:38.140 回答