2017-10-24 1 views
3

필자 스크립트에서 엔지니어링 번호를 비교하고 내 임계 값보다 높은 값을 유지해야합니다. 내 입력 파일 :AWK에서 엔지니어링 번호를 비교하는 동안 이상한 출력

8.63384676823803E-1439,1.59426879513427E-1589,6.30982615035767E-2151,2.28965973937211E-8,7.2400080082093E-470 

내 코드는 다음과 같습니다 그러나

b=5; awk -v var=$b -F "," '{a=$var; if (a >= 1E-10) {a=$var} else {a=0}; print a}' inputfile 

, 내가 a = 7.2400080082093E-470을 얻을 b = 5 (or 1/3/4)를 들어, 일반 비교 awk 'END {if (7.2400080082093E-470 >= 1E-10) print "wrong"}' inputfile가 잘 작동하는 것 같다 반면.

모든 정보 주셔서 감사합니다.

답변

4

AWK가 숫자를 이해하기에 너무 크거나 작습니다.

GNU AWK를 사용하면 임의의 precision integer extension을 활성화하여 -M 명령 줄 스위치를 활성화하여이를 극복 할 수 있습니다.

변수와의 비교가 실패하는 구체적인 메커니즘입니다.

이해하기에 너무 크거나 작은 숫자를 얻으면 대신 문자열처럼 취급합니다.

%b=5; awk -v var=$b -F "," '{ a=$var; print a; }' inputfile 
7.2400080082093E-470 

그런 다음 "진정한"> 1E-10 수율 "7.2400080082093E-470 '의 사전적인 비교

0"

%b=5; awk -v var=$b -F "," '{ a=$var+0; print a; }' inputfile 
0 

숫자 비교를 (지금 강제하자 숫자로 변환) > 1E-10 "은"false "를 산출하며 큰 정수 리터럴을 직접 지정하면 (즉, print 7.2400080082093E-470 ->0) 동일한 결과가 발생합니다. 임의 정밀도를 arithmetics와

활성화 : 나는 큰 숫자와 비슷한 문제가 있었다

b=5; awk -M -v var=$b -F "," '{ a=$var+0; print a; }' inputfile 
7.24001e-470 
+0

제플린, 답변 해 주셔서 감사합니다! 그것은 나를 위해 일합니다. 그러나이 일반 숫자를 비교하면 잘 작동하기 때문에 (awk 'END {if (7.2400080082093E-470> = 1E-10)), 숫자가 변수에 래핑 된 경우에만 문제가 발생하는 이유는 아직 알지 못합니다. – MirrG

+0

@MirrG 일반 숫자 리터럴을 사용하면 비교하기 전에 그냥 '0'으로 변환됩니다. 그 이유는 무엇입니까? (예 : "잘못된") else {인쇄 오른쪽}} 'inputfile' 'awk 'BEGIN {print 7.2400080082093E-470}''을'-M' 스위치와 함께 사용하십시오. – zeppelin

0

. 근원에서 최신 AWK를 건축하는 것은 저를 위해 작동했습니다.