Grep

如何查詢文件中不等於另一個文件中任何名稱的後綴的所有行

  • July 29, 2018

我有兩個文件file1file2. 這兩個文件包含名稱。每行一個名字。我想查詢其中file2的所有名稱not equal to或. 請注意,前綴由任何字元標識,後跟一個點 ( ),然後是後綴。suffix of``file1``.

例如。如果file2包含f2name在一行中,並且file1包含sub.f2name然後f2name是名稱的後綴,file1我們不想將其放在結果中。

另一個例子是sub1.sub2.f2namenamesin前面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 file1:aa.bb.com 並且bb.comfromfile2aa.ff.bb.comand aa.bb.comin的後綴file1(注意:前綴可以重複一兩個以上,關鍵是它以一個名字 in 結尾file2)。

我曾嘗試使用 MySQL 進行查詢。但是 file2 包含 300 萬行,而 file1 包含 100 萬行。MySQL 不能很好地執行。Linux 是否有可以在合理時間內執行此類查詢的命令?

對於您的輸入,我不知道這會有多有效,但這是一個可能的策略:

  1. 將 的線條file2轉換為線條錨定的正則表達式模式
sed -e 's/\./\\./g' -e 's/$/\$/' file2
  1. 通過管道將模式輸入 grep 以僅輸出匹配的部分file1
... | grep -of - file1
  1. (可選)統一結果
  2. file2匹配條目的純文字搜尋
... | grep -vxFf - file2

前任。

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

如果其中的條目file2包含除這些之外的正則表達式特殊字元,.則也需要轉義。

引用自:https://unix.stackexchange.com/questions/459183