getline은 awk 안에서 무엇을합니까?

다음 입력 파일 input.txt

스크립트가 있습니다.

아래 출력을 생성합니다. 누군가이 awk 스크립트가 어떻게 작동하는지 시간을내어 분석해 주시겠습니까? 나는 그것에 대해 약간의 시간을 보냈고 그다지 의미가 없습니다.


입력 :

$ cat input.txt

FINISHED RSYNCJOBNA 20140502 0021 2182096 2082096 6 5 2014820905820902 10:02:15 2014820905820902 10:56:42 0:54:27 INITIATED RSYNCJOBNA 20140502 0022 3282096 3182096 6 5 2014820905820902 15:31:06 0:06:04 ce eque** 

출력 :

RSYNCJOBNA|0021|20140502|10:02:15|10:56:42|0:54:27|FINISHED RSYNCJOBNA|0022|20140502|15:31:06| |0:06:04|INITIATED 

위 출력을 가져 오는 명령 :

awk -v OFS="|" "/FINISHED|INITIATED/ { status = $1; getline; jobname = $1; getline; sequence = $2; date = $1; getline; start = $2; getline; if (status == "FINISHED") { end = $2; getline } else { end = " " } runtime = $1; print jobname, sequence, date, start, end, runtime, status; }" input.txt 

내 이해는 /FINISHED|INITIATED/ {}는 중괄호 안의 명령이 FINISHED 또는 INITIATED와 일치하는 행에서만 실행됨을 의미합니다. 출력에서 알 수있는 한 스크립트는 모든 줄에서 구문 분석하는 것 같습니다. 무슨 일이에요?

댓글

  • 정확히 이해하지 못하는 ' 무엇입니까? 이 경우 : awk 매뉴얼을 읽어 볼까요? 그렇지 않으면 : 정확합니다. 데이터는 변수로 읽혀지고 다른 순서로 출력됩니다.
  • 나는 ' t 위 명령의 getline 함수가하는 일을 알고 있습니다. 또한이 /FINISHED|INITIATED/와 같은 패턴을 제공하면 awk는 해당 줄을 검색하고 해당 특정 줄에서만 작업을 수행합니다. 하지만 작업은 모든 라인에서 수행되었습니다. 어떻게?
  • @HaukeLaging 데이터를 변수로 읽어 들여 다른 순서로 출력 라인은 무엇을 의미합니까?

Answer

getline 함수는 다음 줄을 읽고 스크립트를이 줄로 이동합니다. 연속적인 getline 호출이 다음 줄로 이동합니다. 예를 들어 보면 이해하기 더 쉬울 것입니다.

$ cat input.txt foo 1 2 $ awk "/foo/{print; getline; print; getline; print}" input.txt foo 1 2 

As 위에서 볼 수 있듯이 스크립트는 foo와 일치하기 때문에 첫 번째 줄을 처리합니다. getline에 대한 각 호출은 현재 행 뒤의 행을 읽으므로 후속 print 호출은 다음 행을 인쇄합니다.

답변

awk 함수가하는 일이 무엇인지 모르는 경우 일반적인 전략은 다음과 같습니다. man 페이지를 보려면 :

getline

다음 입력 레코드에서 $ 0 설정; NF, NR, FNR 설정, RT

명령 블록은 실제로 두 번만 실행됩니다. 다른 줄은 내부에서 getline를 통해 처리됩니다. 블록.

다음으로 다시 작성할 수 있습니다.

/FINISHED|INITIATED/ { status = $1; line_number=0; next; } { line_number++; } line_number==1 { jobname = $1; } line_number==2 { sequence = $2; date = $1; } ... 

댓글

  • 다음 레코드가 비어 있으면 어떻게됩니까?
  • @AvinashRaj 귀하의 코드 나 대안 모두 줄의 내용을 보지 않습니다 (/FINISHED|INITIATED/ 제외) ). 줄은 카운트 다운됩니다. 데이터는 정확히 정렬되어야합니다 (awk parsi ng 관점) 그렇지 않으면 코드가 깨집니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다