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로 처리됩니다.
문자열 값은 다음과 같이 처리되어야 합니다.숫자 문자열다음 중 하나에서 발생하는 경우:
필드 변수
getline()
함수로부터의 입력
FILENAME
ARGV
배열 요소
ENVIRON
배열 요소
split()
함수에 의해 생성된 배열 요소명령줄 변수 할당
다른 숫자 문자열 변수에서 변수 할당
[숫자처럼 보이면 전체 설명을 읽어보세요.여기]
또한 읽어보세요RATIONALE
echo 0 000 | awk '$1==$2'
특히 "참이지만 아님"과 같은 비교 와 관련하여 숫자 문자열의 개념과 이 특별한 경우가 필요한 이유는 무엇입니까 echo 0 | awk '$1=="000"'
?
또 다른 특이한 점은 적어도 일부 구현에서는 $0
하위 필드에 대한 할당으로 인해 (현재 입력 레코드의) 재계산이 발생하면 마법의 "숫자 문자열" 속성이 손실된다는 점입니다.
$ echo 0 | gawk '{$1=0} $0'
0
이는 표준 awk의 기반이 되는 nawk/bwk의 동작(그러나 mawk의 동작은 아님)과 일치하지만 표준에서 다루지 않는 것으로 보입니다.
또한 awk 구현은 입력에서 NAN
와 INF
해당 INFINITY
부동 소수점 숫자를 인식할 수 있지만 이에 대한 지원은 불확실하고 일관성이 없습니다. 예를 들어, 여전히 물릴 수 있습니다.
echo But his daughter named Nan | awk '$NF'
FreeBSD의 awk(bwk, original-awk)에서는 아무것도 인쇄하지 마세요.
답변4
왜냐하면 $0은전체 기록(전체 행), $1, $2, 예필드(보통 공백으로 구분).