Grep
如何查詢文件中不等於另一個文件中任何名稱的後綴的所有行
我有兩個文件
file1
和file2
. 這兩個文件包含名稱。每行一個名字。我想查詢其中file2
的所有名稱not equal to
或. 請注意,前綴由任何字元標識,後跟一個點 ( ),然後是後綴。suffix of``file1``.
例如。如果
file2
包含f2name
在一行中,並且file1
包含sub.f2name
然後f2name
是名稱的後綴,file1
我們不想將其放在結果中。另一個例子是
sub1.sub2.f2name
。names
in前面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
等於一個名字 infile1
:aa.bb.com
並且bb.com
fromfile2
是aa.ff.bb.com
andaa.bb.com
in的後綴file1
(注意:前綴可以重複一兩個以上,關鍵是它以一個名字 in 結尾file2
)。我曾嘗試使用 MySQL 進行查詢。但是 file2 包含 300 萬行,而 file1 包含 100 萬行。MySQL 不能很好地執行。Linux 是否有可以在合理時間內執行此類查詢的命令?
對於您的輸入,我不知道這會有多有效,但這是一個可能的策略:
- 將 的線條
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
包含除這些之外的正則表達式特殊字元,.
則也需要轉義。