Exclua as linhas que contêm X na coluna específica .csv [duplicate]

1

Atualmente, uso o seguinte para excluir todos os e-mails que contêm EXAMPLE

sed -i '/EXAMPLE/d' newname.csv

No entanto, isso exclui as linhas que possuem EXAMPLE em qualquer uma das colunas. Eu quero apenas excluir linhas que contenham EXAMPLE na segunda coluna. Colunas são separadas por abas. (exemplo abaixo)

pa**s-***c.com  support@n**.com George Ka*****os    Athens  Athens  1****   GREECE

Devido a problemas de tabulação, nenhum dos abaixo que eu tentei funcionar, então, alternativamente, vou cobrir para .txt e colunas se parecem com isso

"pak**o.asia","jav***[email protected]","T**iq Ja**id","Rajan Pur","punjab","33***0","PAKISTAN"
    
por Teddy291 17.06.2015 / 16:54

3 respostas

2
grep -v '^[^\t]*\t[^\t]*EXAMPLE' <newname.csv >outfile

Mas pode ser necessário usar caracteres literais < tab > , dependendo de qual grep você usa.

O mesmo vale para sed abaixo. Esteja avisado que usar -i vem com certas implicações de segurança do sistema de arquivos:

sed -i '/^[^\t]*\t[^\t]*EXAMPLE/d' ./file

Ou talvez um pouco mais complicado:

sed -i 'h;s/\t/\n/2;/\t.*EXAMPLE.*\n/d;g' ./file

Para os dados do seu exemplo com as vírgulas:

sed -i '/^[^,]*,[^,]*EXAMPLE/d' ./file

A linha inteira é excluída quando EXAMPLE é encontrado antes de outra vírgula após a primeira vírgula.

    
por 17.06.2015 / 17:01
1

Perl pode fazer isso com bastante facilidade:

#!/usr/bin/perl;
use strict;
use warnings;

while (<>) {
    print unless ( split )[1] =~ m/EXAMPLE/;
}

Isso é uma regex sem âncora - você pode querer m/^EXAMPLE$/ .

Isso pode ser feito com uma linha:

perl -ne 'print unless ( split )[1] =~ m/^EXAMPLE$/';
    
por 17.06.2015 / 17:13
-1

Tal tarefa é realmente mais simples e mais fácil de entender usando awk , apenas que o awk não possui uma edição de arquivo no local:

$ awk '$2 !~ /EXAMPLE/ {print $ALL}' old.csv > new.csv

    
por 17.06.2015 / 17:12