我正在尝试搜索包含FileA中行内容的FileB(以逗号分隔)中的行。我最初尝试使用grep
但它似乎并不关心FileA中的某些字符。我不认为CSV格式很重要,至少到grep
。
$ grep -f FileA FileB
grep: Unmatched [ or [^
我愿意使用任何常用的Linux命令,Perl或Python。没有可以匹配的特定表达式,这是使用FileA中的内容进行匹配的原因。下面是FileA中我们想要在FileB中匹配的一些示例行。
page=--&id='`([{^~
page=&rows_select=%' and '%'='
l=admin&x=&id=&pagex=http://.../search/cache?ei=utf-&p=change&fr=mailc&u=http://sub.domain.com/cache.aspx?q=change&d=&mkt=en-us&setlang=en-us&w=afe,dbfcd&icp=&.intl=us&sit=dbajdy.alt
fileB中包含上述字符串的行将在行中包含其他字符,即两个文件不是一个匹配的字符串:
fileA包含abc
,fileB包含012abc*()
,012abc*()
会打印
答案 0 :(得分:2)
一个简单的python解决方案是:
with open('filea', 'r') as fa:
with open('fileb', 'r') as fb:
patterns = fa.readlines()
for line in fb:
if line in patterns:
print line
将整个模式文件存储在内存中,并将另一个文件的每一行与列表进行比较。
但为什么不使用diff
?我必须查看联机帮助页,但我很确定有一种方法可以告诉它两个文件之间的相似之处。谷歌搜索后:
他们给出了解决方案:
diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
--changed-group-format='' a.txt b.txt
答案 1 :(得分:1)
使用fgrep
(或等效grep -F
)。这将模式(FileA
的内容)解释为要搜索的文字字符串而不是正则表达式。
答案 2 :(得分:1)
未经测试的解决方案:
逻辑:
index(..)
返回&gt; 0然后; awk 'NR==FNR{lines[$0]++;next}{for (line in lines) {if (index($0,line)>0) {print $0}}}' FILEA FILEB`