2009-11-19 3 views
4

awk를 사용하여 필드를 일치시킨 후 다음 필드를 가져 오려고합니다.Awk - 일치하는 레코드 다음에 오는 레코드를 인쇄하십시오.

할 수있는 옵션이 있습니까? 아니면 배열로 레코드를 스캔 한 다음 배열의 각 필드를 확인한 후 그 필드를 인쇄해야합니까?

내가 지금까지 가지고 :

파일 형식은 다음과 같습니다

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

... 등등, field|value쌍이 반복 될 것입니다 적어도 한 줄에 한 쌍 또는 여러 쌍 < 라인 당 10

dat.txt :

FIELDA01VALUEA01FIELDA21VALUEA21FIELDA31VALUEA3 
FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3 
FIELDC01VALUEC01FIELDC21VALUEC21FIELDC31VALUEC3 
FIELDD01VALUED01FIELDD21VALUED21FIELDD31VALUED3 
FIELDE01VALUEE01FIELDE21VALUEE21FIELDE31VALUEE3 
함께

라인 일치 FIELDB2에 두 번째 필드를 출력 간단한 awk 스크립트 :

#!/bin/awk -f 

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

실행 위 :이 일치하는 라인 때문이다

VALUEB0 

:

> ./scrpt.awk dat.txt 

저를 제공합니다 :

FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3 

기록에 분할 같습니다

어떤에서 두 번째 필드가 지금은 일치하는 FIELDXX 모르지만 일치 FIELDXX 후 줄에 다음 레코드를 인쇄하고 싶은 VALUEB0

입니다

FIELDB0 VALUEB0 FIELDB2 VALUEB2 FIELDB3 VALUEB3 

, 이 특정 예제에서 FIELDB2이 일치하면 VALUEB2을 인쇄해야합니다.

제안 사항?

답변

7

당신은 라인, 경기에 대한 필드를 통해 다음 루프와 일치하고, 다음 레코드 인쇄 할 수 있습니다

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

를 루프 :

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

를 사용하여 물건을 둔화에 대한 필요가 없습니다 그 매력처럼 작동합니다! 그래도 설명해 주시겠습니까? 나는이 상황에서 "f && NR-1 == f"라고하는 순서를 이해하지 못한다. (NR-1) == f) && f? 필자는 FIELDB2와 일치시키기 위해 NR-1을 사용하고있는 것으로 의심해 NR이 다음 필드가되도록합니다. 그러나 어떻게 완료되고 NR 패턴과 f의 값이 일치하는지 이해할 수 없습니다. 미리 감사드립니다. – laertis

관련 문제