supprimer le zéro final en utilisant awk

J’ai les valeurs suivantes dans mon fichier:

1.5000 0.006 9.0001 104.2500 17.0000 3.5000 

Je veux supprimer le zéro final, le awk suivant va ramener les zéros à la fin

 awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\\.$","",$0);} print}' file 

Sortie de awk ci-dessus,

 1.5 0.006 9.0001 104.25 17 3.5 

Mais je veux append un seul zéro après le point décimal, c’est-à-dire que tout ce que je veux, c’est un nombre flottant sans zéro, sauf des valeurs comme 2.0, 3.0

Sortie exceptée

 1.5 0.006 9.0001 104.25 17.0 3.5 

Possible avec sed :

 sed 's/0\+$//;s/\.$/.0/' 

Si des entiers comme 1200 peuvent apparaître dans l’entrée, manipulez-les séparément:

 sed '/\./{s/0\+$//;s/\.$/.0/;b};s/$/.0/' 

Nouvelle version qui gère mieux les longs chiffres et le texte

 cat file 1.5000 0.006 9.0001 104.2500 17.0000 3.5000 450.0005 test my00000 

 awk '/^ *[0-9]+\.[0-9]+/{sub(/0+$/,"");sub(/\.$/,".0")}1' file 1.5 0.006 9.0001 104.25 17.0 3.5 450.0005 test my00000 

Cela remplace tous les 0 tête avec rien. Si vous obtenez . en finale, le remplacer par .0
Il teste également s’il commence avec 0 ou plus d’espace, que le nombre.

Utilisez la commande ci-dessous pour une sortie plus précise,

Nom de fichier: sam

cat sam

 45.0005 0.4440000 45.000000 66.66 44.000 .45000 45 
  awk '{if($0 ~ /^[0-9]*\.[0-9]+/) { sub(/0+$/,"") sub(/\.$/,".0") sub(/^\./,"0.");} else if($0 ~ /^[0-9]+$/) {sub(/$/,".0");}}1' sam 

Sortie:

 45.0005 0.444 45.0 66.66 44.0 0.45 45.0 

L’utilisation de sed est probablement plus simple dans ce cas:

Remarque:

  • Ce qui suit utilise sed avec -E (alias of -r ) pour permettre la prise en charge des expressions régulières étendues , ce qui rend la commande plus lisible. Il devrait fonctionner avec GNU sed (Linux) et FreeBSD sed (OSX).
  • Utilise une seule commande de substitution ( s/.../.../ ).
  • S’il y a des entiers dans l’entrée, ils ne sont pas modifiés.
 sed -E 's/^( *[0-9]+\.[0-9]([0-9]*[1-9])?)0+$/\1/' file 
  • ^ Au début et $ à la fin, assurez-vous que toute la ligne d’entrée correspond
  • * correspond aux espaces de début, le cas échéant
  • [0-9]+\. correspond à tous les chiffres avant le point décimal, plus le point décimal
  • [0-9] correspond à la première décimale (un seul chiffre) – ceci garantit qu’un nombre se terminant par .0 ne soit pas dépouillé de son 0
  • ([0-9]*[1-9])? correspond à tout chiffre supplémentaire jusqu’à ce qu’un chiffre non nul soit rencontré, le cas échéant
  • 0+ capture alors les zéros à la fin de la ligne
  • dans la chaîne de remplacement, \1 fait référence au 1er groupe de capture ( (...) ), qui est tout sauf les zéros à la fin – les supprimant efficacement.
  • Notez qu’en raison du comportement par défaut de sed de toutes les lignes – modifiées ou non – les lignes sans numéros correspondants (nombres qui n’ont pas besoin de modifications) sont simplement transmises.