显示两个文件中不匹配的字符串

时间:2017-06-07 00:52:28

标签: awk grep

我正在尝试进行多次搜索。在一个文件中,我有一些单词,我想要找回那些不在第二个单词中的单词。

例如,如果我在文件1中有 cat 而在文件2中有我爱猫,我需要回复。文件1将是2.800个单词的列表,文件2是具有900.000个单词的书。我希望得到那些没有出现的2.800。

有可能吗?

我试过这个:

awk 'FNR==NR {a[$1]; next} {for (i=1;i<=NF;i++) {if ($i in a) delete a[$i]}} END {for (i in a) print i}' File1.rtf File2.rtf 

和这个

while read word; do grep -q "$word" File2.rtf || echo "$word"; done < File1.rtf

非常感谢你的帮助!!

1 个答案:

答案 0 :(得分:0)

  • 您的文件名表明您正在处理RTF文件,您需要先将其转换为纯文本。

  • 基于awk的解决方案尝试仅在(a)第二个文件不包含标点符号且(b)可以接受处理单词变体(例如cat vs. cats)作为单独的词语。

  • 基于grep的解决方案会非常慢,因为它会为列表中的每个字创建一个grep子进程。除此之外,它执行 substring 匹配,这可能不是你想要的。

awk命令的以下变体假定为纯文本输入文件和 一个单词的变体可以单独处理;换句话说:它只解决标点问题:

$ awk '
  FNR==NR {a[$1]; next} 
  {
    for (i=1; i<=NF; i++) {
      # Remove punctuation from the field (word).
      gsub(/[[:punct:]]/, "", $i)
      if ($i in a) delete a[$i]}
    } 
  END {for (i in a) print i}
' <(echo $'lamp\ncat') <(echo 'I love my cat.')
lamp

另请注意,输出字将没有特定的顺序,因为Awk数组的键的排序是未定义的(它是一个实现细节)。

总的来说,您应该考虑支持stemming的专业工具;此外,事先对单词列表和书中的单词进行排序可能会加快速度。