Excluir vírgulas à direita na linha


10

Como excluo um conjunto de vírgulas à direita no bash:

a,b,c,d,,,,
1,2,3,,,,

Saída desejada:

a,b,c,d
1,2,3

Tentei fazer isso:

 grep "5628" test.csv | sed 's/,*$//g'

mas não funciona. O arquivo veio originalmente de uma máquina Windows.


2
Tem certeza de que não funcionou? Que comando completo você executou?
— cuonglm

Positivo. Isso não aconteceu.
— User2980702

Você pode fornecer seu comando exata, por favor (o sedque você mostrou, sem um nome de arquivo funciona como um filtro e não processa um arquivo no lugar )
— roaima

grep "5628" test.csv | sed 's /, * $ // g'
— user2980702

2
Se você precisar usar o arquivo no * nix e não conseguir copiá-lo novamente para o Windows, poderá ser mais fácil, a longo prazo, converter as terminações de linha de CR / LF para NL com dos2unixalgo assim .
— G-Man diz 'Restabelecer Monica

Respostas:


13

Re o comando que você forneceu:

grep "5628" test.csv | sed 's/,*$//g'

Isso produzirá linhas correspondentes a '5628' com todas as vírgulas à direita removidas. Não atualizará o arquivo test.csv.

No entanto, você indicou que o arquivo veio de uma máquina Windows, portanto, as terminações de linha são CR / NL em vez de apenas NL. O resultado é que há um CR oculto no final da linha e você precisa de uma linha de comando:

grep "5628" test.csv | sed 's/,*\r*$//'

Na verdade, você pode simplesmente fazer isso em um comando:

sed -n '/5628/s/,*\r*$//p' test.csv

Não estou tentando fazer a atualização no local. Só preciso da saída sem vírgulas
— user2980702

Isso funcionou Muito obrigado. Portanto, estamos procurando várias vírgulas (, *) antes do retorno de carro no final do arquivo (\ r * $). Estou certo ?
— user2980702

Ele \r*permite zero ou mais caracteres CR (portanto continuará funcionando com arquivos derivados do Unix / Linux). Eu preferiria usar \r?para indicar um único CR opcional, mas não conseguia me lembrar da bandeira sedpara dizer para usar EREs no topo da minha cabeça. Eu acho que não é -rtestado aqui. O ,*é seu e corresponde a zero ou mais vírgulas.
— roaima 3/08

o gnão é necessário, neste caso, ter apenas 1 final especificado pelo$
— NeronLeVelu

2
sed -n '/5628/ s/,*\r*$//p' test.csv

(não o OP que pede apenas para remover o coma à direita), isso evita um processo de tubulação, pois leva diretamente o filtro e a conversão

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.