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进行排序等。
答案 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