2013-02-25 4 views
0

Je souhaite effectuer un calcul simple sur chaque nombre dans une colonne de données délimitées par des espaces en utilisant des utilitaires Bash tels que cut et bc. Les données peuvent ressembler à quelque chose comme ce qui suit:Ajouter une nouvelle colonne de nombres à des données délimitées par des espaces en utilisant une autre colonne de nombres utilisant les utilitaires Bash

string 0.998663 string string string 
string 0.998592 string string string 
string 0.999096 string string string 

Disons que je veux changer le spectacle les chiffres dans la deuxième colonne à trois chiffres significatifs. Je veux ajouter une autre colonne de ces nouveaux nombres à ces données directement après la deuxième colonne. Ainsi, le résultat peut ressembler à quelque chose comme ce qui suit:

string 0.998663 0.999 string string string 
string 0.998592 0.999 string string string 
string 0.999096 0.999 string string string 

Je sais que je peux parcourir manuellement toutes ces données et construire de nouvelles colonnes de données, mais je pense qu'il ya un moyen plus efficace de le faire. Auriez-vous connaissance d'une manière intelligente de faire ceci?

Répondre

4

essayer cette courte ligne:

awk '$2=$2" "sprintf("%.3f",$2)' file 

avec votre exemple des données:

kent$ echo "string 0.998663 string string string 
string 0.998592 string string string 
string 0.999096 string string string"|awk '$2=$2" "sprintf("%.3f",$2)' 
string 0.998663 0.999 string string string 
string 0.998592 0.999 string string string 
string 0.999096 0.999 string string string 
+0

+1 mais j'utiliserais 'FS' au lieu de" "c'est-à-dire' awk '$ 2 = $ 2 FS sprintf ("% .3f", $ 2)' fichier' – dogbane

+0

Je savais que cela pouvait être optimisé. Belle solution! – fedorqui

+0

C'est efficace et simple. Merci! – d3pd

1

Vous pouvez essayer avec:

awk '{printf("%s %s %.3f %s %s %s\n",$1,$2,$2,$3,$4,$5)}' file 

test

$ awk '{printf("%s %s %.3f %s %s %s\n",$1,$2,$2,$3,$4,$5)}' file 
string 0.998663 0.999 string string string 
string 0.998592 0.999 string string string 
string 0.999096 0.999 string string string 
+2

Vous n'avez pas besoin d'une boucle ici! 'awk' {printf ("% s% s% .3f% s% s% s \ n", $ 1, $ 2, $ 2, $ 3, $ 4, $ 5)} 'fichier' est suffisant. – dogbane

+0

je ne suis pas sûr si c'est une solution rapide .. vous avez commencé/arrêté awk processus linenumber fois. – Kent

+0

Ceci est une solution claire et agréable. Merci! – d3pd

Questions connexes