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

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

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에서 ​​알 수 있는 한 스크립트는 구문 분석 중인 것 같습니다.모두철사. 어떻게 되어가나요?

답변1

getline함수는 다음 줄을 읽고 스크립트를 해당 줄로 이동합니다. 따라서 연속 getline통화는 다음 회선으로 이동됩니다. 다음 예를 통해 이해하는 것이 더 쉬울 수 있습니다.

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

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

답변2

awk함수의 기능을 모르는 경우 일반적인 전략은 매뉴얼 페이지를 살펴보는 것입니다.

줄을 서다

다음 입력 레코드부터 $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; }
...

관련 정보