如何查询一个文件中不等于另一个文件中的任何名称或后缀的所有行

如何查询一个文件中不等于另一个文件中的任何名称或后缀的所有行

我有两个文件file1file2.这两个文件包含名称。每行一个名字。我想查询 中的所有名称file2not equal tosuffix of的名称file1。请注意,前缀由任何字符后跟一个点 ( .) 和后缀来标识。

例如。如果file2containsf2name在一行中,并且file1contains sub.f2namethenf2name是 in 中名称的后缀file1,我们不想将其放入结果中。

另一个例子是sub1.sub2.f2name。 innames前面file1可以有任意数量的前缀(用点分隔的字符)。的名称file2可以显示为任意数量的前缀的后缀,或者可以等于 中的名称file1

我需要查询 中的名称file2不等于并且不是任意数量的名称前缀的后缀file1。例如:file2包含:

bb.com
a.com
123.com

file1包含:

aa.bb.com
aa.ff.bb.com
aa.bb.cc.com
a.com

我想要的名称是那些file2不等于并且不是名称后缀的名称file1。 IE:

123.com

输出的原因: a.cominfile2等于 in 中的名称file1aa.bb.combb.comfrom是and infile2的后缀(注意:前缀可以重复超过一到两个。重点是它以名称 in 结尾)。aa.ff.bb.comaa.bb.comfile1file2

我尝试过使用 MySQL 进行查询。但是 file2 包含 300 万行,file1 包含 100 万行。 MySQL 无法很好地执行。 Linux 是否有可以在合理时间内执行此类查询的命令?

答案1

对于您的输入,我不知道这将有多有效,但这是一个可能的策略:

  1. 将 的行转换file2为行锚定的正则表达式模式

    sed -e 's/\./\\./g' -e 's/$/\$/' file2
    
  2. 将模式通过管道传输到 grep 中以仅输出匹配的部分file1

    ... | grep -of - file1
    
  3. (可选)使结果唯一化

  4. 纯文本搜索file2匹配的条目

    ... | grep -vxFf - file2
    

前任。

$ sed -e 's/\./\\./g' -e 's/$/\$/' file2 | 
    grep -of - file1 | 
    sort -u | 
    grep -vxFf - file2
123.com

如果 中的条目file2包含除这些之外的正则表达式特殊字符,.也需要转义。

相关内容