A abordagem mais simples é usar sed
com edição no local:
sed -i 's/,*$/,/' file
O -i
faz as alterações no mesmo arquivo. Você pode usar i.bak
para criar um arquivo de backup file.bak
do original. Você também pode executá-lo sem o -i
para ver as alterações antes de aplicá-las. O s/foo/bar/
é o operador de substituição. Ele substituirá a primeira instância de foo
por bar
. O $
marca o final da linha e *
significa "0 ou mais". Portanto, s/,*$/,/
significa "substituir 0 ou mais vírgulas no final da linha por uma vírgula". Se não houver vírgulas, uma será adicionada e, se houver mais de uma, elas serão substituídas por uma única.
Algumas outras opções, para fins de conclusão:
-
Perl
perl -i -pe 's/,*$/,/' file
Mesma ideia que o
sed
acima. É aqui quesed
obteve a idéia de-i
.Se a velocidade é um problema, esta será a mais rápida de todas as soluções aqui:
perl -i -lne 'printf join ",", (grep {$_ ne ""}split(/,/) ); print ","' file
-
awk
awk '{sub(/,*$/,",")}1;' file >newfile
Ou, com versões mais recentes do (g) awk:
awk -iinplace '{sub(/,*$/,",")}1;' file
-
Concha pura (mais lenta e menos eficiente, apenas incluída como exemplo):
while read line; do echo "${line/%,*/},"; done < file > newfile
O
${var/%foo/bar}
substituiráfoo
do final da variávelvar
porbar
. Aqui, estamos substituindo tudo depois da última vírgula, então isso não funcionará se você tiver várias vírgulas por linha, isso só funcionará no seu exemplo . As outras soluções não possuem nenhuma dessas limitações.