我有两个文件file1
和file2
.这两个文件包含名称。每行一个名字。我想查询 中的所有名称file2
或not equal to
中suffix of
的名称file1
。请注意,前缀由任何字符后跟一个点 ( .
) 和后缀来标识。
例如。如果file2
containsf2name
在一行中,并且file1
contains sub.f2name
thenf2name
是 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.com
infile2
等于 in 中的名称file1
:aa.bb.com
而bb.com
from是and infile2
的后缀(注意:前缀可以重复超过一到两个。重点是它以名称 in 结尾)。aa.ff.bb.com
aa.bb.com
file1
file2
我尝试过使用 MySQL 进行查询。但是 file2 包含 300 万行,file1 包含 100 万行。 MySQL 无法很好地执行。 Linux 是否有可以在合理时间内执行此类查询的命令?
答案1
对于您的输入,我不知道这将有多有效,但这是一个可能的策略:
将 的行转换
file2
为行锚定的正则表达式模式sed -e 's/\./\\./g' -e 's/$/\$/' file2
将模式通过管道传输到 grep 中以仅输出匹配的部分
file1
... | grep -of - file1
(可选)使结果唯一化
纯文本搜索
file2
匹配的条目... | grep -vxFf - file2
前任。
$ sed -e 's/\./\\./g' -e 's/$/\$/' file2 |
grep -of - file1 |
sort -u |
grep -vxFf - file2
123.com
如果 中的条目file2
包含除这些之外的正则表达式特殊字符,.
也需要转义。