유명한 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.
awk
Mac과 원격 호스트에서 여러 줄의 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
한 가지 방법만 작동합니다. 그러나 비슷한 상황이 있을 수 있습니다.