Awk 从另一个文件中删除字符串匹配项

Awk 从另一个文件中删除字符串匹配项,awk,sed,grep,Awk,Sed,Grep,我有1.txt: hi aa my name is bb tom how are you cc today 我有2.txt(我不想要的单词) 我的预期产出是 hi my name is tom how are you today 到目前为止,我所尝试的是 sed -e "s/$(sed 's:/:\\/:g' 2.txt)/ /" or grep -Fvf 2.txt 1.txt 我有100多个我不想要的单词,所以我必须用一句话来表达,谢谢 awk 'NR==FNR{ a[$0]; ne

我有1.txt:

hi aa my name is bb tom
how are you cc today
我有2.txt(我不想要的单词)

我的预期产出是

hi my name is tom
how are you today
到目前为止,我所尝试的是

sed -e "s/$(sed 's:/:\\/:g' 2.txt)/ /" 
or
grep -Fvf 2.txt 1.txt
我有100多个我不想要的单词,所以我必须用一句话来表达,谢谢

awk 'NR==FNR{ a[$0]; next }{ for(i in a) gsub("\\<"i"\\> *","",$0) }1' 2.txt 1.txt

  • a[$0]
    -累积每个句子中应该删除的单词

  • gsub(“\\*”,“”,$0)
    -用空字符串替换每个“不需要的”字(作为一个完整的字)


    • 不规范化空格

      $ sed -f <(sed 's/.*/s_\\b&\\b__g/' remove_list) file
      
      hi  my name is  tom
      how are you  today
      aardwark
      

      $sed-f如果
      1.txt
      包含单词“aardvark”,您希望在输出中看到“rdvark”吗?或者,你只想考虑整字匹配吗?是的,我很想保存食蚁兽,所以我想我会把我的2.TXT编辑成一个标准格式,比如“AA”。有没有想过把它们全部删除?谢谢像
      “aa”
      这样的格式的问题是它不匹配以
      “aa”
      开头或以
      “aa”
      结尾的行。是的,这是一个大问题,但就我所能想到的,有什么帮助吗?定义一个“单词”。例如,
      有一个词,还是那两个词?如果
      出现在1.txt中,而
      出现在2.txt中,那么输出是
      (即从字符串
      中删除
      )还是其他内容?这两个文件中除了空格分隔的字母串之外还有其他内容吗?嗨,我两个都试过了,但输出结果与1.txt一样。我在使用mac,这是个问题吗?是的,我经常使用sed,但很多时候不同的系统使用不同的标志,我还在学习。你能告诉我你使用什么样的系统吗?这是GNU-sed,单词边界的
      \b
      应该是标准的,据我所知,不使用任何扩展。Mac OS-sed由于某种原因不喜欢
      \b
      。但这似乎有效:
      sed-f hi-jas,它有效。任何一个网站你能推荐我去掌握它吗?如果删除的单词在行尾会留下一个空格。也许不重要。我可以知道你用的是什么样的系统吗?我正在使用mac。它会带来不同吗?@RobertChoy,运行
      brew install gawk
      ,然后应用我的方法
      hi my name is tom
      how are you today
      
      $ sed -f <(sed 's/.*/s_\\b&\\b__g/' remove_list) file
      
      hi  my name is  tom
      how are you  today
      aardwark
      
      $ sed -f <(sed 's/.*/s_ &\\b__g;s_\\b& __g;s_\\b&\\b__g/' remove) file