3

我正在尝试在 FileB 中搜索包含来自 FileA 中的行的内容的行(以逗号分隔)。我最初尝试使用grep,但它似乎并不关心 FileA 中的某些字符。我不认为 CSV 格式会很重要,至少对grep.

$ grep -f FileA FileB
grep: Unmatched [ or [^

我愿意使用任何普遍可用的 Linux 命令、Perl 或 Python。没有可以匹配的特定表达式,这就是使用 FileA 中的内容进行匹配的原因。下面是我们希望在 FileB 中匹配的 FileA 中的一些示例行。

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 containsabc和 fileB contains 012abc*()012abc*()将打印

4

3 回答 3

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
于 2013-06-13T16:19:09.137 回答
1

使用fgrep(或等效grep -F)。这会将模式(的内容FileA)解释为要搜索的文字字符串,而不是正则表达式。

于 2013-06-13T14:31:00.703 回答
1

未经测试的解决方案:

逻辑:

  • 将 FileB 中的行存储在行数组中
  • 对于行数组中的每一行;
  • 检查数组中的行是否显示为 FileB 中行的一部分
  • 如果index(..)返回 > 0 则;
  • 从 FileB 打印该行

awk 'NR==FNR{lines[$0]++;next}{for (line in lines) {if (index($0,line)>0) {print $0}}}' FILEA FILEB`
于 2013-06-13T15:56:40.903 回答