Como remover última vírgula de cada linha no csv usando linux

5

Eu preciso remover a última vírgula de cada linha.

Eu tenho apenas um arquivo csv, que é assim:

98,N,N,N,N,S,
99,N,N,N,N,S,
101,Y,Y,Y,Y,S,

Eu tenho o seguinte script, mas não está funcionando:

for fname in conv2015_10_LogicalComponent_CosProfile.csv
do
   sed 's/.$//' $fname > tmp.tmp
   mv tmp.tmp $fname
done
    
por yesco1 06.08.2015 / 17:07

6 respostas

6

isso deve funcionar.

    for fname in conv2015_10_LogicalComponent_CosProfile.csv
       do
       cat $fname | sed 's/.$//' > tmp.tmp
       mv tmp.tmp $fname
    done

Outra opção é se você usar a opção "-i" do GNU Sed:

você só precisa fazer isso:

sed -i 's/.$//' filename

Além disso, para esclarecer por que "." é usado lá em vez de ",". Esta é uma expressão regular que corresponde a quase qualquer caractere, portanto, se houver ";" também substituiria isso. Você é mais preciso, você pode mudar ". $" Para ", $".

EDITAR:

Notei que você mencionou que você realmente tem espaços em branco no final. Então esse código funciona, mesmo com espaços em branco. Comprovado no Solaris.

cat filename | sed 's/,[[:blank:]]*$//g > tmp.tmp
mv tmp.tmp desired_filename
    
por 06.08.2015 / 17:14
4

Usando a expansão do parâmetro bash :

while IFS= read -r line; do echo "${line%,}"; done <file.txt

Usando sed :

sed 's/,$//' file.txt

Usando grep com o PCRE:

grep -Po '.*(?=,$)' file.txt 
    
por 06.08.2015 / 17:12
0

Deve funcionar, se você não tiver espaço em branco no final da linha, especialmente retorno de carro. Use cat -vet no arquivo para ver onde realmente está o final da linha (é mostrado por um $).

Você pode simplificar seu sed e mv em uma linha com a opção -i , que atualiza o arquivo.

sed -i 's/,$//' $fname 
    
por 06.08.2015 / 17:12
0

Tente isso

perl -pi -e 's/^(.*),(.+)$/$1/' conv2015_10_LogicalComponent_CosProfile.csv

(.*) corresponderá a tudo até que a última vírgula e o que vier depois disso (espaço em branco) possam ser correspondidos com (.+) e, finalmente, substitua a linha inteira pela primeira correspondência armazenada em $1 .

    
por 06.08.2015 / 20:09
0

Eu usaria o uso vim ou vi . A sintaxe é igual a sed . Use ":" (dois pontos) para entrar no modo de comando e execute %s/,$//g .

    
por 06.08.2015 / 17:32
0

Como esse é um arquivo , separado e você deseja remover o último campo [vazio], que tal diminuir o número de campos em um?

$ awk 'BEGIN {FS=OFS=","} NF--' file
98,N,N,N,N,S
99,N,N,N,N,S
101,Y,Y,Y,Y,S
    
por 06.08.2015 / 22:52