
2つのファイルがあります。そのファイルを123.txt
andと呼びます789.txt
。123.txt
2.5Mライン長、789.txt
65Mライン長。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
フラグはsed
GNUがあると仮定しますsed
。BSDをsed
使用する-i .bak
場合の間にスペースがあります。)
答え2
あなたの例のようなファイルがソートされていて、常にそのパターンに従う場合は、次のように書くことができます。
join -t/ -1 3 -2 3 123.txt 789.txt |
sed -n 's,\([^/]*/\)\([^/]*://\)\2,\2\1,p'
これが最も効率的です。