删除特定列 .csv 中包含 X 的行

删除特定列 .csv 中包含 X 的行

我目前使用以下方法删除包含以下内容的所有电子邮件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

相关内容