Como imprimir linhas com o quinto campo em branco em CSV

3

Eu tenho que verificar se o quinto campo está vazio em um arquivo CSV. Este é o meu arquivo:

1,abc,543,87,DATA,fsg; 
1,abc,543,87,,fsg; 
1,abc,543,87,DATA,fsg; 
1,abc,543,88,,fsg; 
1,abc,543,,DATA,fsg; 

Como você pode ver, a segunda e quarta linhas têm um quinto campo vazio. Eu quero imprimir todas essas linhas.

O resultado deve ser este:

1,abc,543,87,,fsg;
1,abc,543,87,,fsg; 
    
por Abhishek dot py 05.12.2014 / 09:13

8 respostas

8

Outro awk :

$ awk -F, '!length($5)' file
1,abc,543,87,,fsg; 
1,abc,543,88,,fsg;
    
por 05.12.2014 / 09:21
5

Você pode usar um separador de campo diferente (por espaço padrão) com a opção -F e, em seguida, só precisa verificar se a quinta coluna está vazia:

awk -F',' '{if($5==""){print $0}' myfile

ou mais concisa:

awk -F, '$5==""' myfile

-

E com o comando sed:

sed -n '/,,[^,]*$/p' myfile

Não imprima ( -n ), exceto se estiver coincidindo com /,,[^,]*$/ , que termina ( ...$ ) com ,, (5º campo vazio) + um 6º campo que não contém , ( [^,] = tudo, exceto uma vírgula.
Observe que, se você tiver mais de 6 campos, o comando não funcionará como esperado.

    
por 05.12.2014 / 09:21
3

Um awk simples seria suficiente:

awk -F, '$5==""' your_file

Explicação

  • O separador de campos está definido como , ( -F , )
  • A ação padrão de awk é imprimir o registro atual. Nós garantimos que isso só acontece quando o quinto campo está em branco ( $5 == "" )
por 05.12.2014 / 09:20
1

Com grep (como solicitado):

grep -e '.*,.*,.*,.*,,' input 

embora isso corresponda a linhas com campos vazios após o quinto

    
por 05.12.2014 / 09:26
1

Você pode usar o comando awk :

$ awk '/^(.*,){4},.*/' filename
1,abc,543,87,,fsg;
1,abc,543,88,,fsg;

O teste regular de qualquer caractere seguido por um , quatro vezes, e depois o próximo caractere deve ser outro , (quinto campo em branco) seguido por qualquer coisa.

    
por 05.12.2014 / 09:20
1

Uma solução Pythonica:

python3 -c 'import sys, csv;  csv.writer(sys.stdout).writerows(filter(lambda record: record[4] == "", csv.reader(sys.stdin)))' < input.csv
  • Usando o módulo csv , analisamos stdin e filtramos qualquer linha que tenha um quinto elemento vazio (índice 4, pois indexamos de 0).
  • O conjunto filtrado é então escrito usando o módulo csv para stdout .
por 05.12.2014 / 10:00
0

com sed talvez:

sed -n 's/,/,\n/4;s/\n,/,/p'

Ou até mesmo:

sed -n '/^\([^,]*,\)\{4\},/p'

O acima também deve funcionar para qualquer grep - apenas deixe os bits antes e depois de / chars. Em alguns sed s, você pode querer uma nova linha literal em vez de n na primeira s/// ubstitution.

    
por 05.12.2014 / 10:19
0

você também pode encontrar o valor nulo para a quinta coluna na lista de arquivos (BULK OF FILE) e imprimir o registro com o nome do arquivo.

awk -F',' '$5 == "" {printf FILENAME"="$0"\n"}' *common_filepattern*  

explicação:

  • -F, definiu limite de campo para
  • $5 =="" é a coluna 5 para nulo
  • FILENAME = nome do arquivo é a palavra-chave para imprimir o nome do arquivo
por 04.09.2015 / 17:21