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

Awk 在两个文件中显示不匹配的字符串,awk,grep,Awk,Grep,我正在尝试进行多重搜索。在一个文件中,我有一些单词,我想找回那些不在第二个文件中的单词 例如,如果我在文件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}'

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

例如,如果我在文件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 
awk'FNR==NR{a[$1];next}{for(i=1;i
  • 文件名表明您正在处理RTF文件,需要先将其转换为纯文本

  • 您基于
    awk
    的解决方案尝试只有在以下情况下才有效:(a)第二个文件不包含标点符号;(b)可以将单词变体(例如
    cat
    cat
    )视为单独的单词

  • 基于
    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'
FNR==NR{a[$1];next}
{

for(i=1;i
cat
cat
不是同一个词。
$ 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