2つのファイルがあります。最初(メール)は2番目(ドメイン)に基づいて整理する必要があります。 1つ目は15GB、2つ目は160MBです。
dom=`cat file2.txt | xargs | sed -e "s/ /|/g"` ; sed -r "/$dom/d" file1.txt >> final_file.txt
このコマンドは私に与えられましたbash: /bin/sed: Argument list too long
。
ベストアンサー1
あなたが望むようです:
grep -Fvf file2.txt file1.txt > final_file.txt
つまり、行を含まない行に保存されますfinal_file.txt
。file1.txt
file2.txt
-x
必要な行がfile1.txt
ない場合は、このオプションを追加してくださいfile2.txt
。または-w
一致する性格(bar.com
またはでは一致しませんが、例ではまだ一致します)。foobar.com
bar.common
foo.bar.com.us
ただし、ギガバイトのデータとメガバイトの他の文字列を探しても時間がかかります。
このようなシェルを使用するか、プロセス置換をサポートするより速い方法は次のとおりksh
ですzsh
。bash
export LC_ALL=C
comm -23 <(sort file1.txt) <(sort file2.txt) > final_file.txt
今、あなたのコメントに記載されているようにfile2.txt
ドメインのリストであり、file1.txt
そのドメインで終わる行をフィルタリングしたい場合は、より効率的なアプローチはハッシュテーブルを使用することです。@
awk -F@ '
! domains_processed {excluded[$0]; next}
! ($NF in excluded)
' file2.txt domains_processed=1 file1.txt > final_file.txt
アプローチに問題があります。
不要な使用
cat
(UUOC)。cat
接続ファイルです。単一ファイルには大きな意味はありません。ファイルの内容をプッシュするプロセスのパイプではなく、直接stdinをファイルとして使用または作成xargs < file
でき< file xargs
ます。xargs
cat
xargs
echo
デフォルトで呼び出されます。引数をここで必要な空白文字に関連付ける間、他の操作も実行され、echo
そのリストは実装によって異なります。また、xargs
非常に具体的な形式の入力を期待しています。ここでは、各行をGNUに合わせてfile2.txt
別々の引数として渡したいと思います。また、引数のサイズ制限を避けるために必要な回数だけ実行されます。したがって、160MB 入力の場合、出力には複数行があります。echo
xargs -rd '\n'
xargs
echo
xargs
ファイルの行を特定の文字に関連付けるには、次のコマンドを使用します
paste
。paste -sd '|' file2.txt
ここでは、これらの単語を組み合わせて正規表現
sed -r
(-r
GNU拡張子として)を作成します|
が、この行の正規表現演算子をエスケープしません。ドメイン名の場合は、.
すべての文字に一致する正規表現演算子であることに注意してください。他のキャラクターとより大きな問題が発生します。sed "/$dom/r"
完全な統制権を持っていない場合file2.txt
。file2.txt
160MBならそれくらいです$dom
。コマンドラインのサイズは制限されています。 Linuxでは、単一パラメータのサイズも制限されているため(最大128KiB)、パラメータを介してsed
スクリプトを渡すことはできません。渡す必要があります-f
。