2012-12-14 5 views
0

La commande suivante ne sélectionne pas la deuxième chaîne de la ligne impaire et la quatrième de la ligne impaire-paire. show_statistic.sh | grep -A 1 vlan | awk '{ if ((NR % 2) == 1) { print $2 } else { print $4 } }'
Il imprime les deuxième et quatrième chaînes de chaque ligne. Qu'est-ce que j'ai fait de mal?Rejoindre chaque ligne avec AWK

+2

Qu'est-ce qu'une ligne impaire? Pouvez-vous montrer quelques exemples d'entrées et de sorties attendues? –

+1

Afficher la sortie de show_statistics.sh et nous dire ce que vous essayez de faire avec une sortie attendue à la fin de votre traitement de la sortie show_statistics.sh. Vous n'avez pas besoin de grep avec awk et vous utilisez mal awk donc nous devons commencer à partir de l'étape 1. –

+0

@ sampson-chen L'anglais n'est pas ma langue maternelle. impair-même peut être 2ème, 4ème, 6ème .. {n = 1 impair-pair = 2 * n, même = 2 * n-1} lignes que notre dictionnaire :-) – tsoomo

Répondre

2

Il semble que votre résultat attendu provienne des lignes contenant "vlan" et des suivantes.

Votre code fonctionnera avec une réponse unique, mais avec plus d'un réponse à vos résultats seront differents séparés bi une ligne containig seulement « - » comme indiqué dans grep:

-A NUM 
     Places a line containing a group separator (--) between 
     contiguous groups of matches. With the -o or --only-matching 
     option, this has no effect and a warning is given. 

Donc, avec cette ligne plus vous voulez que le deuxième argument sur la ligne 1, 4, 7 ... Et la quatrième sur la ligne 2, 5, 8 ...

vous code peut être:

show_statistic.sh | grep -A 1 vlan | awk '{ if ((NR % 3) == 1) { print $2 } else { if (NR % 3 == 2) { print $4 } } }' 

J'écris un petit fichier texte à tester:

1line here 
2foo 
vlan 2a 3a 4a 5a 
1 2 3 4 5 
bar 

line here 
vlan 2a 3a 4a 5a 
1 2 3 4 5 
line here 
baz 

Le résultat est:

$ grep -A 1 vlan file| awk '{ if ((NR % 3) == 1) { print $2 } else { if (NR % 3 == 2) { print $4 } } }' 
2a 
4 
2a 
4 
+0

+1 pour trouver une mise en page pour le shell sortie de commande. –

+0

Merci Pierre-Louis Laffont. Séparateur de groupe (-) était la troisième ligne :-) Je l'ai eu – tsoomo

2

Si la sortie de votre commande shell suit la mise en page du fichier échantillon créé par @ Pierre-LouisLaffont puis est ici la commande complète, vous devez utiliser:

$ awk 'f{print $4;f=0} /vlan/{print $2;f=1}' file 
2a 
4 
2a 
4 

Lorsque se trouve vlan il imprime le 2ème champ et définit un drapeau pour dire vlan a été trouvé. Sur la ligne suivante, il imprime le 4ème champ et réinitialise le drapeau. Ça ne pouvait pas être plus simple.

+0

ça marche plus vite. Merci @Ed Morton – tsoomo

Questions connexes