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:
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). 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 \1
fait référence au 1er groupe de capture ( (...)
), qui est tout sauf les zéros à la fin – les supprimant efficacement. 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.