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?
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