如果第二列位于单词列表中,则从 CSV 文件中删除行

如果第二列位于单词列表中,则从 CSV 文件中删除行

我找到了一长串免费电子邮件提供商,我想将其从我的电子邮件列表中删除 -https://gist.github.com/tbrianjones/5992856

下面是我当前使用的两个命令,它们对少数或单个域条目执行相同的工作,但是如何将它们转换为从另一个文件导入单词?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

两步:

  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

Update2 具有额外的删除域:创建一个包含例外列表 (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

相关内容