awk는 언제 개행 문자를 ";"으로 취급합니까?

awk는 언제 개행 문자를 ";"으로 취급합니까?

유명한 awk 튜토리얼을 읽고 있어요http://www.grymoire.com/Unix/Awk.html.

언급한To be precise, in the original AWK you can insert a new line character after the curly braces, and at the end of a command, but not elsewhere.

awkMac과 원격 호스트에서 여러 줄의 awk 명령을 사용하고 따르는 것을 테스트했습니다 gawk.

  awk '$0 !~ /special_signal/  \
       { my_dict[$1] += $2 }
       END { for (uid in my_dict)   \
             if (my_dict[uid] > 1)  \
             print uid, my_dict[uid]}' raw_data | sort -nk2

위 awk 코드에 대한 원래 한 줄 awk 명령은 다음과 같습니다.

awk '$0 !~ /special_signal/ { my_dict[$1] += $2 } END { for (uid in my_dict) if (my_dict[uid] > 1) print uid, my_dict[uid]}' raw_data | sort -nk2

내 실험을 통해. 나는 on 및 첫 번째 것이 필수적이라는 것을 발견했습니다 awk. gawk그것이 \없으면 코드는 원래의 한 줄짜리 코드와 다르게 동작할 것입니다. 줄 바꿈의 효과는 다음과 같습니다.;

그러나 두 awk 버전 중 두 번째와 세 번째 버전은 필요하지 않습니다 \.for (uid in my_dict)if (my_dict[uid] > 1)

나는 그것들을 제거했고 여러 줄의 코드가 한 줄의 코드와 똑같이 작동합니다.

그런 다음 두 번째와 세 번째를 \로 대체했는데 ;, 이로 인해 여러 줄의 코드가 잘못된 결과를 생성했습니다.

for (uid in my_dict)이것은 다음에 줄바꿈을 추가하면 if (my_dict[uid] > 1)두 코드 블록을 다음 코드 줄과 연결한다는 것을 추가로 증명합니다 \.

내 결론은 튜토리얼과 충돌하는 것 같습니다.

그렇다면 실제로 awk는 어떤 상황에서 개행 문자를 처리하며 ;어떤 상황에서 이를 처리합니까 \?


추신: 테스트를 위해 몇 가지 테스트 콘텐츠를 만들었습니다 raw_data.

Tom 2
Tom 5
Jack 3
Mary 5
special_signal 5
Tim 10
Don 22
Jan 3
Jack 8
special_signal 10

답변1

예제 줄의 차이점은 다음과 같습니다. 이 시점에서 명령을 완료할 수 있습니까? 패턴은 그 자체로 존재할 수 있습니다 {print}. 다음 줄은 두 번째 명령으로 간주됩니다(첫 번째 명령의 두 번째 부분이 아님). 이 패턴은 항상 참인 것으로 간주됩니다.

그러나 제어 구조( for, if)에서는 그 시점에서 명령을 완료할 수 없으므로 명령이 다음 줄에서 계속될 것이 분명합니다.

쉘 코드에서도 유사합니다:

echo foo &&
echo bar

설명이 다르다

echo foo
&& echo bar

그래서 당신은 필요

echo foo \
&& echo bar

이와 달리 awk한 가지 방법만 작동합니다. 그러나 비슷한 상황이 있을 수 있습니다.

관련 정보