두 번째 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
명령의 및 형식 >>
도 셸이 이러한 토큰을 처리하는 방법에서 영감을 얻었지만 이러한 형식에 대한 자세한 내용은 설명서를 참조하세요.|
print
awk
귀하의 코드에는
print 3 > 5 ? "Hello" : "World"
이는 구문과 일치하므로 이라는 print > expression
문자열을 출력합니다 . 줄의 나머지 부분에는 이해할 수 없는 물음표가 계속 표시되므로 이에 대해 불평합니다. 일부 구현 에서는 이 비트 를3
5
awk
awk
5 ? "Hello" : "World"
expression
3
Hello
5
진짜부울 값으로 사용되는 경우 값).
당신이 가장 하고 싶은 일은
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")}'