Comment puis-je changer la 2ème colonne de positif à négatif et vice versa
aa.txt
31OCT2013:00:00:00,220.10,"O","090500 13549951" 31OCT2013:00:00:00,-0.32,"I","090500 13549964"
La réponse devrait être
aa.txt
31OCT2013:00:00:00,-220.10,"O","090500 13549951" 31OCT2013:00:00:00,+0.32,"I","090500 13549964"
Si j’utilise awk
'BEGIN{FS=OFS=","} {$2=-$2}1' aa.txt
le résultat est
1OCT2013:00:00:00,-220.1,"O","090500 13549951" 31OCT2013:00:00:00,+0.32,"I","090500 13549964"
Dans le premier résultat, le signe change, mais 0 est manquant, au lieu de -220.10
, il affiche -220.1
.
Considérant que vous voulez changer la deuxième colonne en fonction de la virgule, cela peut être un moyen:
$ awk 'BEGIN{FS=OFS=","} {$2=-$2}1' aa.txt 31OCT2013:00:00:00,-220.1,"O","090500 13549951" 31OCT2013:00:00:00,0.32,"I","090500 13549964"
Voir
31OCT2013:00:00:00,-220.1,"O","090500 13549951" ^ 31OCT2013:00:00:00,0.32,"I","090500 13549964" ^
Avec la version précédente, nous perdions des zéros, selon un comportement arithmétique. Pour le gérer correctement, nous pouvons faire:
awk 'BEGIN{FS=OFS=","} {if ($2>0) $2="-"$2; else sub("-", "", $2)}1' file
Si la valeur est positive, elle ajoute un tiret devant la chaîne. Sinon, il ne fait que supprimer le tiret.
Étant donné un fichier exemple
$ cat a 31OCT2013:00:00:00,220.10,"O","090500 13549951" 31OCT2013:00:00:00,-0.32,"I","090500 13549964" 31OCT2013:00:00:00,0.300,"I","090500 13549964" 31OCT2013:00:00:00,-0.300,"I","090500 13549964" 31OCT2013:00:00:00,0,"I","090500 13549964"
Il retourne
$ awk 'BEGIN{FS=OFS=","} {if ($2>0) $2="-"$2; else sub("-", "", $2)}1' a 31OCT2013:00:00:00,-220.10,"O","090500 13549951" 31OCT2013:00:00:00,0.32,"I","090500 13549964" 31OCT2013:00:00:00,-0.300,"I","090500 13549964" 31OCT2013:00:00:00,0.300,"I","090500 13549964" 31OCT2013:00:00:00,0,"I","090500 13549964
sed 's/^\([^,]*,\)-/\1/ t s/^[^,]*,/&-/' YourFile
Basé sur -
existence
Utilisez sprintf pour formater la sortie.
awk 'BEGIN{FS=OFS=","} {$2=sprintf("%+.2f",-$2)}1' aa.txt