如果在FileS中找到单词,则从文件中删除包含单词的行

时间:2014-03-15 11:02:27

标签: string bash sed grep comparison

FileA包含单词,FileB包含字符串。

如何使用sed / grep / awk(最好)从FileB中删除包含在FileA中找到的单词的行?

示例FileA:

  

Word asdf
Word qwer
Word zxcv

示例文件B:

  

https://www.webaddress.com/point?a=asdf
  http://www.webaddress.com/point?a=pert
  https://www.webaddress.com/point?a=njil
  http://www.webaddress.com/point?a=qwer
  http://www.webaddress.com/point?a=zxcv

因此,FileB应更改为:

  

http://www.webaddress.com/point?a=pert
  https://www.webaddress.com/point?a=njil

速度是一个问题,因为FileA和FileB都可能很大。如果需要,可以对FileA和FileB进行排序等。

3 个答案:

答案 0 :(得分:3)

grep -F -v -f <(sed 's/^Word //' FileA) FileB > FileB.new
  • -F表示匹配固定字符串而不是正则表达式。
  • -v表示输出不匹配的行
  • -f表示从文件名
  • 获取要匹配的字符串列表
  • <(command line)合成命令行输出的文件名
  • sed命令会从Word的所有行中删除FileA前缀。

答案 1 :(得分:2)

您可以使用grep

grep -v -f <(awk '{print $2}' FileA) FileB > tmp && mv tmp FileB

Glenn Jackman所述,您还可以使用-F grep选项,使其将模式视为固定字符串,效率更高。

<( )语法称为process substitution,并生成包含单词列表的文件,即从word中删除fileA

-f的{​​{1}}选项从文件中获取模式。 grep选项反转匹配。因此,-v中的第fileB段中的任何单词都不包含任何单词。

为了您的输入,它会产生:

fileA

答案 2 :(得分:0)

以下是awk解决方案:

awk 'FNR==NR{a[$2]++;next} {for (i in a) if ($0~i) next}8' fileA fileB
http://www.webaddress.com/point?a=pert
https://www.webaddress.com/point?a=njil