AWK가 이 조건문에 오류를 표시하는 이유는 무엇입니까?

AWK가 이 조건문에 오류를 표시하는 이유는 무엇입니까?

두 번째 awk oneliner에서는 단순히 <for를 전환했는데 >구문 오류가 발생했습니다. >조건문에는 허용 되지 않나요 ?

~/Desktop $ awk 'BEGIN{print 3<5 ? "Hello":"World"}'
Hello
~/Desktop $ 
~/Desktop $ awk 'BEGIN{print 3>5 ? "hello": "world"}'
awk: cmd. line:1: BEGIN{print 3>5 ? "hello": "world"}
awk: cmd. line:1:                 ^ syntax error
~/Desktop $
~/Desktop $ awk 'BEGIN{print 5<3 ? "Hello":"World"}'
World
~/Desktop $
~/Desktop $

답변1

print진술은 세 가지 형식 중 하나를 취합니다 awk.

  • print > expression
  • print >> expression
  • print | expression

...여기서 >, >>및 다음 비트는 선택 사항입니다 |.expression

이 명령을 사용 하면 계산 결과인 문자열로 명명된 파일 print > expression로 출력이 이동하게 됩니다 . expression파일이 존재하는 경우 잘립니다(비어집니다). 이는 셸에서 출력 리디렉션이 작동하는 방식과 유사하게 작동하지만 print동일한 명령문을 두 번째 실행하면 처음과 관련된 파일을 close(expression)닫는 데 사용되지 않는 한 파일이 잘리지 않습니다.expression

명령의 및 형식 >>도 셸이 이러한 토큰을 처리하는 방법에서 영감을 얻었지만 이러한 형식에 대한 자세한 내용은 설명서를 참조하세요.|printawk

귀하의 코드에는

print 3 > 5 ? "Hello" : "World"

이는 구문과 일치하므로 이라는 print > expression문자열을 출력합니다 . 줄의 나머지 부분에는 이해할 수 없는 물음표가 계속 표시되므로 이에 대해 불평합니다. 일부 구현 에서는 이 비트 를​35awkawk5 ? "Hello" : "World"expression3Hello5진짜부울 값으로 사용되는 경우 값).

당신이 가장 하고 싶은 일은

print ( 3 > 5 ? "Hello" : "World" )

또는

print ( 3 > 5 ) ? "Hello" : "World"

이렇게 하면 print > expression구문이 트리거되지 않습니다.

답변2

프레젠테이션에만 텍스트를 사용하세요.

표현식 주위에 괄호를 사용하십시오.

$ awk 'BEGIN{print (5>3 ? "Hello":"World")}'
Hello
$ awk 'BEGIN{print (3>5 ? "Hello":"World")}'
World

아마도 >문자는 인쇄 명령으로 리디렉션된 파일로 해석됩니다.

답변3

귀하의 코드에는 출력 리디렉션 오른쪽에 괄호로 묶이지 않은 삼항 표현식이 있을 수 있습니다. 두 가지 질문이 있습니다:

  • 출력(또는 입력) 리디렉션의 오른쪽에서 괄호로 묶이지 않은 표현식을 리디렉션하는 것은 POSIX의 정의되지 않은 동작이므로 절대 그렇게 해서는 안 됩니다.
  • 괄호로 묶인 삼항 표현식은 괄호로 묶인 삼항 표현식보다 읽기 어렵고 일부 컨텍스트에서는 일부 awks로 구문 오류를 일으킬 수 있으므로 그렇게 하지 마십시오.

나쁜:

print > foo bar
getline < foo bar
str = x>y ? foo : bar

좋아요:

print > (foo bar)
getline < (foo bar)
str = (x>y ? foo : bar)

그러나 여러 출력 파일을 생성하는 경우 일반적으로 런타임에 해당 파일을 닫은 다음 출력 파일 이름을 변수의 표현식 결과로 저장하고 대괄호 없이 저장하는 것이 좋습니다. 예를 들면 다음과 같습니다.

out = foo bar
print > out
close(out)

따라서 귀하의 코드는 다음과 같습니다.

awk 'BEGIN{print 3<5 ? "Hello" : "World"}'
awk 'BEGIN{print 3>5 ? "hello" : "world"}'
awk 'BEGIN{print 5<3 ? "Hello" : "World"}'

수행해야 하는 작업에 따라 출력 리디렉션의 오른쪽에 괄호를 사용하지 않거나 트리플 주위에 괄호를 사용하지 않거나 둘 다이므로 다음과 같이 작성해야 합니다.

awk 'BEGIN{print (3<5 ? "Hello" : "World")}'
awk 'BEGIN{print (3>5 ? "hello" : "world")}'
    or, less likely, awk 'BEGIN{print 3 > (5 ? "hello" : "world")}'
awk 'BEGIN{print (5<3 ? "Hello" : "World")}'

관련 정보