Awk - распечатать следующую запись после соответствующей записи - PullRequest
4 голосов
/ 19 ноября 2009

Я пытаюсь получить следующее поле после сопоставления поля с помощью awk.

Есть ли возможность сделать это или мне нужно отсканировать запись в массив, затем проверить каждое поле в массиве и распечатать одно после этого?

Что у меня так далеко:

Формат файла:

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

... и так далее, пары field|value повторяются, будет по крайней мере одна пара в строке или несколько пар <10 на строку </p>

dat.txt:

FIELDA01VALUEA01FIELDA21VALUEA21FIELDA31VALUEA3
FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3
FIELDC01VALUEC01FIELDC21VALUEC21FIELDC31VALUEC3
FIELDD01VALUED01FIELDD21VALUED21FIELDD31VALUED3
FIELDE01VALUEE01FIELDE21VALUEE21FIELDE31VALUEE3

С помощью простого скрипта awk, который печатает второе поле в строке, соответствующей FIELDB2:

#!/bin/awk -f

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

Запуск вышеуказанного:

> ./scrpt.awk dat.txt

дает мне:

VALUEB0

Это потому, что совпадающая строка:

FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3

При разбиении на записи выглядит:

FIELDB0 VALUEB0 FIELDB2 VALUEB2 FIELDB3 VALUEB3

Из которого второе поле VALUEB0

Теперь я не знаю, какой FIELDXX будет соответствовать, но я хотел бы напечатать следующую запись в строке после совпадения FIELDXX, в этом конкретном примере, когда FIELDB2 соответствует, мне нужно напечатать VALUEB2 .

Есть предложения?

Ответы [ 2 ]

7 голосов
/ 19 ноября 2009

Вы можете сопоставить строку, затем обвести поля для совпадения и распечатать следующую запись:

awk -F1 '/FIELDB2/ { for (x=1;x<=NF;x++) if ($x~"FIELDB2") print $(x+1) }' 
2 голосов
/ 27 августа 2013

Нет необходимости замедлять работу с помощью цикла:)

awk -F1 '/FIELDB2/ {f=NR} f&&NR-1==f' RS="1" file
VALUEB2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...