我正在尝试进行多次搜索。在一个文件中,我有一些单词,我想要找回那些不在第二个单词中的单词。
例如,如果我在文件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
非常感谢你的帮助!!
答案 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的专业工具;此外,事先对单词列表和书中的单词进行排序可能会加快速度。