あるファイルの一部が別のファイルに表示される場合は、そのファイルの行を印刷します。どちらのファイルも何百万行もの長さです。

あるファイルの一部が別のファイルに表示される場合は、そのファイルの行を印刷します。どちらのファイルも何百万行もの長さです。

2つのファイルがあります。そのファイルを123.txtandと呼びます789.txt123.txt2.5Mライン長、789.txt65Mライン長。grepまたは、同様の789.txt行を含む行を維持する方法はありますか?123.txt?

には1行に最大1つの重複項目があり789.txt、繰り返しテキストは行の先頭にあります。私は完全に詰まっており、オンラインで情報を見つけることができないので、始めるものは何もありません。サーバーで実行されるので、時間がかかっても大丈夫です(そうなることを知っています)。

  • 123.txt:

    hxxp://www.a.com
    hxxp://www.b.com
    hxxp://www.c.com
    
  • 789.txt:

    hxxp://www.a.com/kgjdk-jgjg/
    hxxp://www.b.com/gsjahk123/
    hxxp://www.c.com/abc.txt
    hxxp://www.d.com/sahgsj/
    
  • 希望の出力:

    hxxp://www.a.com/kgjdk-jgjg/
    hxxp://www.b.com/gsjahk123/
    hxxp://www.c.com/abc.txt
    

ベストアンサー1

以下を使用すると、簡単にこれを行うことができますgrep

$ grep -Ff 123.txt 789.txt
http://www.a.com/kgjdk-jgjg/ 
http://www.b.com/gsjahk123/ 
http://www.c.com/abc.txt 

789.txt上記のコマンドは。 -fを含むファイルを印刷します123.txt。 -fは「このファイルから検索するパターンを読み取ります」を意味し、-Fは検索パターンをデフォルトの正規表現ではなく文字列として扱うようにgrepに指示します。

123.txt行に末尾のスペースが含まれている場合は機能しません。スペースgrepはパターンの一部として検索され、単語内で発生した場合は一致しません。たとえば、パターンfoo (末尾のスペースを参照)は一致しませんfoobar。ファイルから末尾のスペースを削除するには、次のコマンドを実行します。

$ sed 's/ *$//' 123.txt > new_file

次にgrepを使用してくださいnew_file

$ grep -Ff new_file 789.txt

次のフラグを使用すると、新しいファイルを使用せずにiこれを行うことができます。

$ sed -i.bak 's/ *$//' 123.txt

これによりファイルが変更さ123.txtれます123.txt.bak

(この形式の-iフラグはsedGNUがあると仮定しますsed。BSDをsed使用する-i .bak場合の間にスペースがあります。)

おすすめ記事