bash: /bin/sed: パラメーターのリストが長すぎます。

bash: /bin/sed: パラメーターのリストが長すぎます。

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.txtfile1.txtfile2.txt

-x必要な行がfile1.txtない場合は、このオプションを追加してくださいfile2.txt。または-w一致する性格bar.comまたはでは一致しませんが、例ではまだ一致します)。foobar.combar.commonfoo.bar.com.us

ただし、ギガバイトのデータとメガバイトの他の文字列を探しても時間がかかります。

このようなシェルを使用するか、プロセス置換をサポートするより速い方法は次のとおりkshですzshbash

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ます。xargscat

  • xargsechoデフォルトで呼び出されます。引数をここで必要な空白文字に関連付ける間、他の操作も実行され、echoそのリストは実装によって異なります。また、xargs非常に具体的な形式の入力を期待しています。ここでは、各行をGNUに合わせてfile2.txt別々の引数として渡したいと思います。また、引数のサイズ制限を避けるために必要な回数だけ実行されます。したがって、160MB 入力の場合、出力には複数行があります。echoxargs -rd '\n'xargsechoxargs

    ファイルの行を特定の文字に関連付けるには、次のコマンドを使用しますpaste

    paste -sd '|' file2.txt
    
  • ここでは、これらの単語を組み合わせて正規表現sed -r-rGNU拡張子として)を作成します|が、この行の正規表現演算子をエスケープしません。ドメイン名の場合は、.すべての文字に一致する正規表現演算子であることに注意してください。他のキャラクターとより大きな問題が発生します。sed "/$dom/r"完全な統制権を持っていない場合file2.txt

  • file2.txt160MBならそれくらいです$dom。コマンドラインのサイズは制限されています。 Linuxでは、単一パラメータのサイズも制限されているため(最大128KiB)、パラメータを介してsedスクリプトを渡すことはできません。渡す必要があります-f

おすすめ記事