2009-11-19 5 views
4

J'essaie d'obtenir un champ suivant après l'appariement du champ en utilisant awk.Awk - imprimer l'enregistrement suivant suivant l'enregistrement correspondant

Existe-t-il une option pour faire cela ou ai-je besoin de scanner l'enregistrement dans la matrice puis vérifier chaque champ dans le tableau et imprimer celui après cela?

Ce que j'ai jusqu'à présent:

Le format de fichier est:

<FIELD><separator "1"><VALUE><separator "1"><FIELD><separator "1"><VALUE> 

... et ainsi de suite, field|value paires sont répétées, sera au moins une paire en ligne ou plusieurs paires < 10 par ligne

dat.txt:

FIELDA01VALUEA01FIELDA21VALUEA21FIELDA31VALUEA3 
FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3 
FIELDC01VALUEC01FIELDC21VALUEC21FIELDC31VALUEC3 
FIELDD01VALUED01FIELDD21VALUED21FIELDD31VALUED3 
FIELDE01VALUEE01FIELDE21VALUEE21FIELDE31VALUEE3 

Avec simple script awk qui imprime le deuxième champ sur un FIELDB2 correspondant de ligne:

#!/bin/awk -f 

BEGIN { FS = "1" } 
/FIELDB2/ { print $2 } 

Exécution ci-dessus:

> ./scrpt.awk dat.txt 

Donne-moi:

VALUEB0 

En effet, la ligne qui correspondent à:

FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3 

Quand divisé en dossiers semble:

FIELDB0 VALUEB0 FIELDB2 VALUEB2 FIELDB3 VALUEB3 

D'où le second champ est VALUEB0

Maintenant, je ne sais pas quelle FIELDXX correspondra mais je voudrais imprimer l'enregistrement suivant sur la ligne après FIELDXX qui correspondait, Dans cet exemple spécifique, lorsque FIELDB2 correspond, j'ai besoin d'imprimer VALUEB2.

Des suggestions?

Répondre

7

Vous pouvez correspondre à la ligne, puis en boucle sur les champs pour un match, et d'imprimer l'enregistrement suivant:

awk -F1 '/FIELDB2/ { for (x=1;x<=NF;x++) if ($x~"FIELDB2") print $(x+1) }' 
2

Pas besoin de ralentir les choses en utilisant une boucle :)

awk -F1 '/FIELDB2/ {f=NR} f&&NR-1==f' RS="1" file 
VALUEB2 
+0

Ce fonctionne comme un charme! Cela vous dérangerait-il d'expliquer? Je ne comprends pas la plupart du temps l'ordre dans cette condition "f && NR-1 == f", est-ce ainsi ((NR-1) == f) && f? Je suppose que vous utilisez NR-1 pour correspondre à FIELDB2 et donc laisser NR être le champ suivant, mais je ne peux pas comprendre comment cela est fait et quelles sont les valeurs de NR et f concernant le motif correspondant. Merci d'avance – laertis