Besoin de supprimer – (less) signe à la fin en nombre de nombreuses colonnes et l'insert sur des colonnes supprimées

J'ai un énorme file csv qui a – (less) signe à la fin des numbers. Maintenant, je dois déplacer ces signes less pour commencer les nombres, c'est-à-dire que je dois enlever le dernier caractère s'il a le signe «-» et placer le signe «-» à l'avant.

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 

J'ai essayé le ci-dessous mais s'il y a une valeur décimale '.' caractère, alors il ajoute le signe less avant cela:

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

la sortie est inférieure à:

 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 

S'il vous plaît suggérer un liner awk / sed / perl pour faire ce travail?

Cordialement, Vino.

Le ci-dessous travaillé: Toute autre solution awk ou sed serait génial à savoir …

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

Identique à la command perl,

 $ sed 's/\([0-9]\+\.[0-9]\+\)-/-\1/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 

Un autre one-liner perl,

 $ perl -pe 's/([^,\n]*?)-/-\1/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 

Un autre perl

 perl -F, -lane 'print join ",", map {(/-$/ && chop) . $_} @F' file 

Voici quelques-uns:

  1. Un perl plus court

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

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

     sed 's/\([0-9.]*\)-/-1\1/g' file 
  4. Rester bouche bée. Notez que les différentes variantes awk ne sont pas très bonnes pour les tâches qui impliquent la capture de patterns. GNU awk (gawk) et d'autres peuvent le faire mais j'utiliserais plutôt l'une des solutions ci-dessus.

     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 

    Je suis sûr qu'il doit y avoir une meilleure façon de le faire, mais ce qui précède va fonctionner en dépit d'être laid et encombrant.

  5. Inutilement complexe

     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'