2010-07-05 11 views
3

le programme suivant a besoin d'imprimer les motsawk + valeur à l'exportation à awk

First 

Second 

Third 

Mais parce que je paramètre de awk pas obtenir la valeur de « pour » boucle son empreinte tous les mots:

 First second third 
    First second third 
    First second third 

Comment fixer awk afin d'imprimer d'abord le « premier » second mot le mot « deuxième » et ainsi de suite

THX

Yael

program: 

for i in 1 2 3 
do 
echo "first second third" | awk '{print $i}' 
done 

Répondre

2

Vous pouvez changer votre code comme ceci:

for i in 1 2 3 
do 
echo "first second third" | awk -v i=$i '{print $i}' 
done 

Pour utiliser la variable 'i' de la coquille.

Vous pouvez aussi changer le séparateur d'enregistrement (RS) pour avoir le même résultat:

echo "first second third" | awk 'BEGIN{RS=" "} {print $1}' 

Mais je ne sais pas si c'est ce que vous cherchez.

+2

Il est préférable de ne pas utiliser la méthode entre guillemets guillemet car il est difficile à lire. Ceci, qui utilise le passage variable d'awk, est meilleur: 'awk -v i = $ i '{print $ i}'' –

+0

Vous avez certainement raison 'écho 'premier deuxième tiers" | awk '{print $' $ {i} '}' 'n'était pas une bonne solution. J'ai donc édité la réponse pour suivre votre méthode. – Aissen

2

Vous pouvez faire:

for a in First Second Third 
do 
    awk 'BEGIN { print ARGV[1] }' $a 
done 

Ou vous pourriez faire:

for a in First Second Third 
do 
    awk -v arg=$a 'BEGIN { print arg }' 
done 
+0

+1 pour suggérer «-v» –

2

ne font pas le nécessaire. le shell pour la boucle n'est pas nécessaire! Fais le juste avec awk!

$ echo "first second third" | awk '{for(i=1;i<=NF;i++)print $i}'

+0

c'est simple .... + 1 – repzero

0

Ou vous pouvez utiliser:

echo "first second third" | awk -F " " -v OFS="\n" '{print $1,$2,$3}'