他のファイルの名前やサフィックスと同じでない限り、ファイル内のすべての行を照会する方法

他のファイルの名前やサフィックスと同じでない限り、ファイル内のすべての行を照会する方法

file12つのファイルがあり、file2これら2つのファイルには。 1行に1つの名前です。のすべての名前file2またはnot equal toにあるsuffix of名前を照会したいですfile1。接頭辞は、.任意の文字と点()と接尾辞によって識別されます。

例えば。file2インクルードがf2name行にあり、インクルードfile1がの名前のサフィックスsub.f2namef2nameある場合、file1結果に含めたくありません。

もう一つの例はですsub1.sub2.f2name。 inのnames前には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。つまり:

123.com

出力理由: a.cominはinのfile2名前と同じで、fromはand inのサフィックスです(注:プレフィックスは1つまたは複数回繰り返すことができます。重要なのは、名前がinで終わるということです)。file1aa.bb.combb.comfile2aa.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項目にこれら以外の正規表現特殊文字が含まれている場合でも、.エスケープする必要があります。

おすすめ記事