Precisa remover - (menos) o sinal no final em número de várias colunas e inseri-lo em colunas removidas

3

Eu tenho um enorme arquivo csv que tem sinal - (Minus) no final dos números. Agora eu preciso mover estes - sinais negativos para começar os números, ou seja, eu preciso remover o último caractere se ele tiver um sinal '-' e colocar o sinal '-' na frente.

0.00,70440.19-,18.31-,0.00,451.59-,13788.77-,44.19-,6289.29-
1.03-,39.24-,0.11-,16.96-,0.00,72377.70-,0.00,146673.67-,59.11-,0.00

Eu tentei o abaixo, mas se houver um valor decimal '.' personagem, em seguida, adiciona o sinal de menos antes disso:

perl -pe 's#(\d{1,})(-)#$2$1#'g  file

a saída está abaixo:

0.00,70440.-19,18.-31,0.00,451.-59,13788.-77,44.-19,6289.-29
1.-03,39.-24,0.-11,16.-96,0.00,72377.-70,0.00,146673.-67,59.-11,0.00

Por favor, sugira que algum forro do awk / sed / perl faça este trabalho?

Atenciosamente, Vino.

    
por VinothKumar N 05.09.2014 / 14:13

4 respostas

1

O abaixo funcionou: Qualquer outra solução de awk ou sed seria ótima saber ...

perl -pe 's#(\d{1,}[.]\d{1,})(-)#$2$1#'g  file
    
por 05.09.2014 / 14:28
1

Igual ao comando perl,

$ sed 's/\([0-9]\+\.[0-9]\+\)-/-/g' file
0.00,-70440.19,-18.31,0.00,-451.59,-13788.77,-44.19,-6289.29
-1.03,-39.24,-0.11,-16.96,0.00,-72377.70,0.00,-146673.67,-59.11,0.00

Outro perl one-liner,

$ perl -pe 's/([^,\n]*?)-/-/g' file
0.00,-70440.19,-18.31,0.00,-451.59,-13788.77,-44.19,-6289.29
-1.03,-39.24,-0.11,-16.96,0.00,-72377.70,0.00,-146673.67,-59.11,0.00
    
por 05.09.2014 / 14:43
1

Outro perl

perl -F, -lane 'print join ",", map {(/-$/ && chop) . $_} @F' file
    
por 05.09.2014 / 15:50
0

Aqui estão alguns:

  1. Um perl mais curto

    perl -pe 's/([\d.]+)-/-$1/g' file 
    
  2. (GNU) sed

    sed -r 's/([0-9.]+)-/-/g' file 
    
  3. Qualquer sed

    sed 's/\([0-9.]*\)-/-1/g' file 
    
  4. Gawk. Observe que as diversas variantes do awk não são muito boas em tarefas que envolvem a captura de padrões. O GNU awk (gawk) e outros podem fazer isso, mas eu usaria uma das soluções acima.

    gawk -F, '{
                for(i=1; i<NF; i++){
                    if(sub(/-/,"",$i)){printf "-%s,",$i}
                    else{printf "%s,",$i}
                }
                if(sub(/-/,"",$NF)){print "-"$NF}
                else{print $NF} }' file 
    

    Tenho certeza de que deve haver uma maneira melhor de fazê-lo, mas o que foi dito acima funcionará, apesar de ser feio e complicado.

  5. Desnecessariamente complexo

    perl -pe 's/\n/\n\n/; s/,/\n/g; ' file | 
        awk -F"-"  '/-/{printf "-";}{print $1}' | 
            perl -000ne 's/\n./,/g;s/\n\n/\n/g; print'
    
por 05.09.2014 / 14:45

Tags