gerenciar campos separados por vírgula

0

Eu tenho um grande volume de dados dentro de um arquivo de texto como o seguinte formato:

x, xx, xxx, xxxx, , , ,
x, xx, , xxxx, xxxx,

então eu gostaria de excluir do arquivo todas as linhas que o campo número 3 depois que a vírgula estiver vazia

para que o resultado seja

x, xx, xxx, xxxx, , , ,

então como fazer isso?

    
por αԋɱҽԃ αмєяιcαη 15.06.2017 / 15:40

3 respostas

3

Usando o GNU awk :

$ awk -F' *, *' '$3' file
x, xx, xxx, xxxx, , , ,  

Com -F , definimos o separador de campo para a expressão regular ␣*,␣* (espaço, estrela, vírgula, espaço, estrela). Essa expressão corresponde a qualquer vírgula cercada por zero ou mais espaços.

O script awk real é apenas $3 , o que significa que, se o terceiro campo não estiver vazio, a linha será impressa.

    
por 15.06.2017 / 15:52
2
Solução

awk :

awk -F, '$3!~/^[[:space:]]*$/' file

A saída:

x, xx, xxx, xxxx, , , ,
  • -F, - separador de campos

  • $3!~/^[[:space:]]*$/ - considerando apenas as linhas que têm o campo não vazio 3 (não consiste em espaços em branco)

por 15.06.2017 / 15:44
0

Perl

perl -ne 'print if /^([^,]*,){2}\h*[^\h,]/' yourcsvfile

Analisamos os dois primeiros campos csv e, em seguida, verificamos se o final do segundo e do início dos terceiros campos tem pelo menos espaço não horizontal, sem vírgula. Quando coincide, encontramos nossa linha.

perl -F, -lane 'print if $F[2] =~ /\S/' yourcsvfile

Nós dividimos a linha em campos delimitados por vírgulas, armazenados no array @F , depois procuramos pelo 3º $F[2] e verificamos se há pelo menos um \S de espaço não-branco nele.

Sed

sed -e '
   s/,/\n/2;s/,/\n/2
   /\n[[:space:]]*\n/d
   y/\n/,/
' yourfile.csv

Marque o 3º campo por novas linhas. Então, quando há todo o espaço em branco ou nada entre os dois marcadores = > linha a ser excluída. OTW, nós revertemos os marcadores e sed imprime o espaço padrão por padrão.

    
por 15.06.2017 / 16:27