2017-06-07 42 views
0

我正在尝试执行多个搜索。在一个文件中我有一些文字,我想找回那些不在第二个文件中的文件。在两个文件中显示不匹配的字符串

举例来说,如果我有猫在文件1我喜欢在文件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

'cat'和'cat''不是同一个词。 – dawg

回答

0
  • 您的文件名建议您处理RTF文件,您需要首先将其转换为纯文本格式。如果(a)第二文件不包含任何标点符号和(b)是可以接受的治疗字词变化(如catcats)作为单独的单词

  • awk为基础的解决方案的尝试只会工作。

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

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的专门工具;另外,事先将书中的单词和单词排序可能会加快速度。

相关问题