2番目の列が単語リストにある場合、CSVファイルから行を削除する

2番目の列が単語リストにある場合、CSVファイルから行を削除する

私の電子メールリストから削除したい無料の電子メールプロバイダの長いリストを見つけました。https://gist.github.com/tbrianjones/5992856

以下は、少数または単一ドメイン項目に対して同じ操作を実行するために現在使用されている2つのコマンドです。しかし、他のファイルから単語を取得するようにコマンドを変換するにはどうすればよいですか?remove.txtたとえば、すべての項目を手動で追加する代わりに。

ruby -rcsv -i -ne 'row = CSV::parse_line($_); puts $_ unless row[2] =~ /gmail|hotmail|qq.com|yahoo|live.com|comcast.com|icloud.com|aol.co/i' All.txt

sed -i '/^[^,]*,[^,]*hotmail/d' All.txt

以下は、私たちが使用するデータ行です。

"fox*******","scott@sc***h.com","821 Ke****on Rd","Neenah","Wisconsin","54***6","UNITED STATES"

答え1

2つのステップ:

  1. 削除スクリプト(AUX)の生成print unless m!gmail.com!hotmail.com|...!(正規表現は大きいが問題ありません)
  2. それを適用するAll.txt

パスワード:

perl -n0E 's/\n/|/g; say "print unless m!\\b($_ç)\\b!\n" ' remove.txt > AUX
perl -n AUX    All.txt > outfile

アップデート1:大文字と小文字を区別しないようにするには、i以下を追加します。

perl -n0E 's/\n/|/g; say "print unless m!@($_=)\\b!i\n" ' remove.txt > AUX

アップデート 2 には追加の削除フィールドがあります。例外リスト(extra.txt)を含む新しいファイルを作成し、次の操作を行います。

cat remove.txt extra.txt | 
  perl -n0E 's/\n/|/g; say "print unless m!@($_=)\\b!i\n" ' > AUX
perl -n AUX   All.txt > outfile

答え2

{   sed -ne's/./^[^,]*,[^,]*&/p' | 
    grep -vf- ./All.txt 
}   <./remove.txt >./outfile

私の考えでは、それがあなたが尋ねた質問だと思います。rubyあなたが言ったデータケーブルと何が関係しているのかわかりません。

大文字と小文字を区別せずに一致させるには、大文字と小文字を無視する-iオプションを追加しますgrep

{   sed -ne's/./^[^,]*,[^,]*&/p' | 
    grep -ivf- ./All.txt 
}   <./remove.txt >./outfile

関連情報