我目前使用以下方法删除包含以下内容的所有电子邮件EXAMPLE
sed -i '/EXAMPLE/d' newname.csv
EXAMPLE
但是,这会删除任何列中的行。我希望它只删除EXAMPLE
第二列中包含的行。列由制表符分隔。 (下面的例子)
pa**s-***c.com support@n**.com George Ka*****os Athens Athens 1**** GREECE
由于制表符问题,我尝试过的以下方法都不起作用,因此我将覆盖 .txt,列看起来像这样
"pak**o.asia","jav***[email protected]","T**iq Ja**id","Rajan Pur","punjab","33***0","PAKISTAN"
答案1
grep -v '^[^\t]*\t[^\t]*EXAMPLE' <newname.csv >outfile
但你可能需要使用文字<选项卡>那里的字符取决于grep
您使用的字符。
下面同样如此sed
。请注意,使用-i
会带来某些文件系统安全隐患:
sed -i '/^[^\t]*\t[^\t]*EXAMPLE/d' ./file
或者可能更棘手一点:
sed -i 'h;s/\t/\n/2;/\t.*EXAMPLE.*\n/d;g' ./file
对于带逗号的示例数据:
sed -i '/^[^,]*,[^,]*EXAMPLE/d' ./file
删除整行EXAMPLE
出现在第一个出现的逗号之后的另一个逗号之前。
答案2
Perl 可以很方便地做到这一点:
#!/usr/bin/perl;
use strict;
use warnings;
while (<>) {
print unless ( split )[1] =~ m/EXAMPLE/;
}
这是一个未锚定的正则表达式 - 你可能需要m/^EXAMPLE$/
代替。
这可以简单地表示为:
perl -ne 'print unless ( split )[1] =~ m/^EXAMPLE$/';
答案3
这样的任务实际上使用 更简单且更容易理解awk
,只是 awk 没有就地文件编辑:
$ awk '$2 !~ /EXAMPLE/ {print $ALL}' old.csv > new.csv