$1의 값이 0(숫자 0)인 경우 awk가 다르게 동작하는 이유는 무엇입니까?

$1의 값이 0(숫자 0)인 경우 awk가 다르게 동작하는 이유는 무엇입니까?

awk가 수신할 때"0"입력으로서 경우에 따라 다르게 동작합니다. 코드는 아래와 같이 표시됩니다.

var=$1
echo ""; echo -n 'o/p of $1=$1 ==>'; echo $var | awk '$1=$1'
echo "";echo -n 'o/p of {$1=$1;print} ==>';echo $var | awk '{$1=$1;print}'
echo "";echo -n 'o/p of $1==$1 ==>';echo $var | awk '$1==$1'
echo "";echo -n 'o/p of {$1==$1;print} ==>';echo $var | awk '{$1==$1;print}'

으로 출력"0"(숫자 0):

[root@host ~]# sh /tmp/te.sh 0

o/p of $1=$1 ==>
o/p of {$1=$1;print} ==>0

o/p of $1==$1 ==>0

o/p of {$1==$1;print} ==>0
[root@GORJALA ~]#

으로 출력"1"(첫 번째):

[root@host ~]# sh /tmp/te.sh 1

o/p of $1=$1 ==>1

o/p of {$1=$1;print} ==>1

o/p of $1==$1 ==>1

o/p of {$1==$1;print} ==>1
[root@host ~]#

var=0; echo $var | awk '$1=$1'및 를 사용할 때 왜 차이가 발생합니까 var=1; echo $var | awk '$1=$1'? 을 제외한 모든 숫자가 정상적으로 작동합니다 0.

버전:

  • GNU 배시, 버전 4.2.46
  • GNU Awk 4.0.2
  • coreutils-8.22-24.el7.x86_64

답변1

~에서GNU Awk 사용자 가이드:

할당은 표현식이므로 할당되는 값과 동일한 값을 갖습니다. 따라서 "z = 1"은 값이 1인 표현식입니다.

그래서

  • echo 0 | awk '$1=$1'이 모드는 0(FALSE)으로 평가됩니다.

  • echo 1 | awk '$1=$1'print이 모드는 1(TRUE)로 평가되고 기본 작업을 수행합니다.

답변2

나는 그것이 숫자 값에 문제가 있다고 생각하지 않습니다. 표준 변환이 (적어도 여기에서는) 그것을 처리합니다.

OP에는 다음과 같은 네 가지 다른 awk 코드가 표시되었습니다. 패턴 { action }

(1) 1달러 = 1달러

이는 $1를 자신에게 재할당합니다. 이는 부울 테스트가 아니며 (실제로는) 아무 작업도 수행하지 않으며 $1 값을 반환합니다. $1이 0이면 패턴은 다음과 같습니다.잘못된및 기본값인쇄 작업을 완전히 건너뛰었습니다.. $1이 0이 아닌 경우입력이 인쇄됩니다.

(b) { $1 = $1 }

이는 $1를 자신에게 재할당하며, 이는 또한 작동하지 않습니다. 모드가 없으면 작업을 수행하고 들어갑니다.항상 인쇄.

(c) $1 == $1

부울 표현식입니다.항상 옳다. 0은 0이고 1은 1입니다(땅돼지는 땅돼지입니다). 조치가 없는 경우 입력은 다음과 같습니다.항상 인쇄.

(d) { $1 == $1 }

패턴이 없습니다. 비교 결과가 실제 부울 값이면 부울 값은 삭제됩니다. 입력은항상 인쇄.

답변3

기존 답변으로는 이유를 설명할 수 없습니다.

echo 0 | awk '$0="0"'
echo 0 | awk '$0=substr($0,1)'
echo 0 | awk '$0=$0""'

모두 인쇄 0하지만

echo 0 | awk '$0'
echo 000 | awk '$0'

아무것도 인쇄되지 않지만 모든 경우에 패턴 표현식은 로 평가됩니다 0.

0한 사례는 사실이고 다른 사례는 거짓인가요?

이는 "필드 변수"(연산자의 결과 $)가 다음과 같이 처리되기 때문입니다.특별한 경우및 (가능한 경우)은 자동으로 다음으로 변환됩니다.숫자 문자열, 숫자가 동일하면 0부울 컨텍스트에서 사용될 때 false로 처리됩니다.

문자열 값은 다음과 같이 처리되어야 합니다.숫자 문자열다음 중 하나에서 발생하는 경우:

  1. 필드 변수

  2. getline()함수로부터의 입력

  3. FILENAME

  4. ARGV배열 요소

  5. ENVIRON배열 요소

  6. split()함수에 의해 생성된 배열 요소

  7. 명령줄 변수 할당

  8. 다른 숫자 문자열 변수에서 변수 할당

[숫자처럼 보이면 전체 설명을 읽어보세요.여기]

또한 읽어보세요RATIONALEecho 0 000 | awk '$1==$2'특히 "참이지만 아님"과 같은 비교 와 관련하여 숫자 문자열의 개념과 이 특별한 경우가 필요한 이유는 무엇입니까 echo 0 | awk '$1=="000"'?


또 다른 특이한 점은 적어도 일부 구현에서는 $0하위 필드에 대한 할당으로 인해 (현재 입력 레코드의) 재계산이 발생하면 마법의 "숫자 문자열" 속성이 손실된다는 점입니다.

$ echo 0 | gawk '{$1=0} $0'
0

이는 표준 awk의 기반이 되는 nawk/bwk의 동작(그러나 mawk의 동작은 아님)과 일치하지만 표준에서 다루지 않는 것으로 보입니다.

또한 awk 구현은 입력에서 NANINF해당 INFINITY부동 소수점 숫자를 인식할 수 있지만 이에 대한 지원은 불확실하고 일관성이 없습니다. 예를 들어, 여전히 물릴 수 있습니다.

echo But his daughter named Nan | awk '$NF'

FreeBSD의 awk(bwk, original-awk)에서는 아무것도 인쇄하지 마세요.

답변4

왜냐하면 $0은전체 기록(전체 행), $1, $2, 예필드(보통 공백으로 구분).

관련 정보