Como remover o separador do campo que terminou em cada última linha?

0

Como remover o separador do campo "," que terminou em cada última linha? por sed / awk / perl um linear

Exemplo de arquivo csv:

zoo.cfg,autopurge.purgeInterval,24,
zoo.cfg,autopurge.snapRetainCount,30,,,,
zoo.cfg,clientPort,2181,
zoo.cfg,dataDir,/var/hadoop/zookeeper,
zoo.cfg,initLimit,10,,
zoo.cfg,syncLimit,5,1,1,,
zoo.cfg,tickTime,2000,,,,,,,,,,

resultado esperado:

zoo.cfg,autopurge.purgeInterval,24
zoo.cfg,autopurge.snapRetainCount,30
zoo.cfg,clientPort,2181
zoo.cfg,dataDir,/var/hadoop/zookeeper
zoo.cfg,initLimit,10
zoo.cfg,syncLimit,5,1,1
zoo.cfg,tickTime,2000
  • target - remove o separador de campos desnecessários "," ou "," ou "," etc. em cada linha.
por yael 21.08.2017 / 13:30

2 respostas

1
$ sed 's/,,*$//' input

Isso substituirá todas as vírgulas no final da linha por nada (elas serão excluídas).

,,*$ corresponderá a uma ou mais vírgulas no final da linha (literalmente "uma vírgula e, em seguida, zero vírgulas ou mais").

A outra maneira de fazer isso é corrigir a coisa que produz os dados para que não produzam campos vazios.

    
por 21.08.2017 / 13:35
3

Usando sed :

sed 's/,*$//' infile

isso corresponderá a zero ou mais vírgulas no final de cada linha. Com algumas implementações de sed , você pode informar sed para corresponder a um ou mais no final com:

sed 's/,\+$//' infile

(o equivalente portátil / padrão é ,\{1,\} , então você pode usar também ,,* ou ,* que faria o mesmo).

Ou com o GNU grep ou compatível:

grep -o '.*[^,]'

Isso imprimirá apenas -o de tudo até a última não-vírgula (embora tenha o efeito colateral de remover linhas vazias).

Ou com o% GNUawk ou mawk :

awk '1' RS=',*\n'  #or
awk '1' RS=',+\n'

Isso está definindo o eperador R ecord S como regex de ,*\n (sem mais vírgulas ou ,+\n (um ou mais comas) até que \n ewline seja visto .

O 1 é apenas uma condição sempre verdadeira e isso fará com que os registros sejam impressos e ignorados RS .

Ou em perl :

perl -pe 's/,*$//' #or
perl -pe 's/,+$//' 
    
por 21.08.2017 / 13:35