awk 'NR%2 ...' 이해하기

awk 'NR%2 ...' 이해하기

안녕하세요, 저는 Bash를 배우기 위해 "Bash Command Line and Shell Scripting Pocket Introduction"을 사용하고 있는데 짝수 줄을 인쇄하라는 awk 장을 이해하지 못합니다.

주문하다:

awk ' NR%2 { printf "%s", $0; print "" }' < data

콘텐츠데이터텍스트 파일:

a,b,c,d
e,f,g,h
1,2,3,4
5,6,7,8

산출:

a,b,c,d
1,2,3,4

내 질문은 왜 짝수 줄 대신 홀수 줄을 인쇄합니까?

나는 NR%2==1 및 NR%2==0을 실행했고 예상대로 홀수/짝수 출력을 제공했습니다.
내가 무엇을 놓치고 있나요?

답변1

NR~이다하나를 기준으로레코드(라인) 번호입니다. NR % 2이를 2로 나누어 나머지를 반환하므로 홀수는 1이고 짝수는 0입니다. awk에서는 0이 아닌 숫자가 true이므로 첫 번째 줄, 세 번째 줄 등이 인쇄됩니다.

NR0부터 세기 시작하면 상황이 달라집니다.

답변2

1은 "참"으로 간주되고 0은 "거짓"으로 간주되기 때문입니다. 따라서 NR % 20이 아닌 경우 줄이 인쇄되므로 홀수 줄이 출력됩니다.

답변3

쉘 스크립트에서 0은 성공을 의미하고 1은 실패를 의미한다는 내용을 많이 읽어보셨을 것입니다. 이것은 절대적으로 사실입니다. 하지만,awk는 쉘이 아닙니다, awk는 쉘 스크립트에서 호출할 수 있는 완전히 별도의 도구이며 awk는 종료 상태를 테스트하지 않고 부울 조건을 테스트합니다. 여기서 C 및 기타 많은 Algol 기반 언어와 마찬가지로 0이 아닌 것은 true를 의미하고 0은 false를 의미합니다. .

이 쉘 스크립트에서 이것이 무엇을 의미하는지 고려하십시오.

$ foo=0; if [ $foo ]; then echo "success"; else echo "failure"; fi
success

또는 동등하게:

$ foo=0; if test $foo; then echo "success"; else echo "failure"; fi
success

이것을 awk 스크립트와 비교해 보세요:

$ awk 'BEGIN{ foo=0; if ( foo ) print "true"; else print "false" }'
false

두 스크립트 모두 테스트 중이지만 0쉘에서는 성공을 의미하는 종료 상태인 반면, awk에서는 false를 의미하는 조건입니다. 두 가지 매우 다릅니다.

껍질에는결과of [ $foo ](or test $foo)는 it에 포함된 종료 상태에 대한 단축형을 수행하며 [, 그런 다음 조건으로 평가되어 true로 확인됩니다. 다음과 같이 작성하여 awk에서 동일한 기능을 얻을 수 있습니다.testfooif

awk '
    function test(exit_status) { return (exit_status==0 ? 1 : 0) }
    BEGIN{ foo=0; if ( test(foo) ) print "true"; else print "false" }
'
true

당신은 예라고 말합니다 I did run NR%2==1 and NR%2==0 and it gives me odd / even output as predicted.. awk 1(또는 0이 아닌 다른 값)는 true조건부 컨텍스트에 있으므로 현재 줄을 인쇄하는 0반면 false는 현재 줄을 인쇄하지 않기 때문입니다.

관련 정보