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:
Un perl plus court
perl -pe 's/([\d.]+)-/-$1/g' file
(GNU) sed
sed -r 's/([0-9.]+)-/-\1/g' file
Tout sed
sed 's/\([0-9.]*\)-/-1\1/g' file
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.
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'