J'essaie de manipuler un fichier qui contient des nombres en notation scientifique, mais sans le e
symbole, c'est 1.2e+3
-à- dire écrit comme 1.2+3
.
La chose la plus simple à laquelle j'ai pensé awk
était de remplacer +
par e+
, en utilisant la gsub
fonction et de faire mon calcul dans le nouveau fichier. Il en va de même pour le cas négatif. Donc, un simple correctif pourrait être fait en utilisant la commande suivante
awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in
et faites de même dans toutes les colonnes.
Cependant, le fichier contient également des nombres négatifs, ce qui complique un peu les choses. Un exemple de fichier peut être vu ci-dessous
1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6
2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4
3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6
4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6
6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5
7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5
9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5
9.248130+1 5.000000-1 3.069610-3 2.786329-2-6.317000-5
1.049935+2 5.000000-1 4.218794-2 3.321955-2-5.097000-6
1.216283+2 5.000000-1 1.432105-2 3.077165-2 4.300300-5
Une idée sur la façon de manipuler et de calculer avec un tel fichier?
text-processing
awk
Thanos
la source
la source
Réponses:
Cette sortie est-elle correcte?
Code:
Explication:
-lne
prendre soin des fins de ligne, traiter chaque ligne d'entrée, exécuter le code qui suits/(\.\d+)(\+|\-)/\1e\2/g
:s
)(.\d+)(\+|\-)
trouver deux groupes de (un point et des nombres) et (un plus ou un moins)\1e\2
les remplacer par le premier groupee
puis le deuxième groupeg
globalement - ne vous arrêtez pas à la première substitution de chaque ligne, mais traitez tous les hits possiblesprint
imprimer la lignesample
fichier d'entréeCelui-ci ajoute de l'espace s'il manque. En fait, cela met de l'espace entre les nombres malgré tout. C'est à dire. s'il y avait deux espaces dans certains cas, il n'y en aurait qu'un dans la sortie.
La majeure partie est similaire à la précédente. La nouveauté est le
(\d+)
groupe n ° 3 et le(\s*)
groupe n ° 4.*
signifie ici facultatif. Dans la substitution, aucun\4
n'est utilisé. Il y a un espace à la place.La sortie est la suivante:
la source
.
dans le premier groupe. C'est correct. Sans cette barre oblique inverse, le point ne signifierait pas un point littéral.Vous pouvez également utiliser
sed
, par exemple:Cependant, cela ne tient pas compte du fait que les colonnes de la liste OP ne sont parfois pas séparées. Voici une solution de contournement avec une précision appropriée:
Production:
la source
2.698100-2-2.034300-4
OFMT
variable pour définir la précision de awk sur la même valeur que celle de l'entrée