Nawk special numbers


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Nawk special numbers
# 1  
Old 04-28-2015
Nawk special numbers

Just stumbled over a terrible feature in nawk derivates. I did not find it documented in man pages.
HP-UX 11.31:
Code:
echo info | awk '{print $1+0}'
inf
echo nano | awk '{print $1+0}'
nan
echo info | awk '{print $1-$1}'
-nan

Solaris 10:
Code:
echo info | nawk '{print $1+0}'
Inf
echo nano | nawk '{print $1+0}'
NaN
echo info | nawk '{print $1-$1}'
NaN

I hope this is not implemented in any Posix or GNU awk version...

Last edited by MadeInGermany; 04-28-2015 at 11:24 AM.. Reason: OS version
# 2  
Old 04-28-2015
AIX 7.1

Code:
$ echo info | nawk '{print $1+0}'
INF
$ echo nano | nawk '{print $1+0}'
NaNQ
$ echo info | nawk '{print $1-$1}'
NaNQ

Windows

Code:
> echo info | gawk '{print $1-$1}'
0
> echo info | gawk '{print $1+0}'
0
> echo nano | gawk '{print $1+0}'
0
> gawk --version
GNU Awk 3.1.7

This User Gave Thanks to agent.kgb For This Post:
# 3  
Old 04-28-2015
The POSIX standards for awk specify that it must behave as if it uses (at least) double precision floating point values as defined by the C Standard. When ptr points to a string starting with a case insensitive "infinity", "inf", or "NaN", the C standard requires strtod(ptr, endptr) to set endptr to point to the character after the last character matched from one of those three strings and return the double precision floating point format representation for an infinity, infinity, or Not A Number, respectively, on systems that also support the IEEE 754 floating point standard.

So, yes, POSIX requires what was reported on HP/UX and Solaris systems. (Note, however, that the POSIX conforming version of awk on Solaris systems is /usr/xpg4/bin/awk; not nawk.) I'm not sure where the "Q" in NaNQ reported on AIX is coming from. The gawk output shown on Windows appears to be non-conforming.

And, for the record, on OS X Yosemite 10.10.3, the output from those three commands is, respectively:
Code:
inf
nan
nan

These 4 Users Gave Thanks to Don Cragun For This Post:
# 4  
Old 04-28-2015
And:
Code:
$ echo info | gawk --posix '{print $1+0}'
inf
$ echo nano | gawk --posix '{print $1+0}'
nan
$ echo info | gawk --posix '{print $1-$1}'
nan

Code:
$ echo info | gawk '{print $1+0}'
0
$ echo nano | gawk '{print $1+0}'
0
$ echo info | gawk '{print $1-$1}'
0


--
Alas, /usr/xpg4/bin/awk on Solaris:
Code:
$ echo info | /usr/xpg4/bin/awk '{print $1+0}'
0
$ echo nano | /usr/xpg4/bin/awk '{print $1+0}'
0
$ echo info | /usr/xpg4/bin/awk '{print $1-$1}'
0

--
mawk:
Code:
$ echo info | mawk '{print $1+0}'
inf
$ echo nano | mawk '{print $1+0}'
nan
$ echo info | mawk '{print $1-$1}'
nan


Last edited by Scrutinizer; 04-28-2015 at 05:46 PM..
These 2 Users Gave Thanks to Scrutinizer For This Post:
# 5  
Old 04-29-2015
Code:
Historical implementations of awk did not support floating-point infinities and NaNs in numeric strings; e.g., "-INF" and "NaN". 
However, implementations that use the atof() or strtod() functions to do the conversion picked up support for these values 
if they used a ISO/IEC 9899:1999 standard version of the function instead of a ISO/IEC 9899:1990 standard version. 
Due to an oversight, the 2001 through 2004 editions of this standard did not allow support for infinities and NaNs, 
but in this revision support is allowed (but not required). This is a silent change to the behavior of awk programs; 
for example, in the POSIX locale the expression:
("-INF" + 0 < 0)
formerly had the value 0 because "-INF" converted to 0, but now it may have the value 0 or 1.

Code:
strtod recognizes four special input strings. The strings "inf" and "infinity" are converted to &infin;, 
or to the largest representable value if the floating-point format doesn’t support infinities. 
You can prepend a "+" or "-" to specify the sign. Case is ignored when scanning these strings.
The strings "nan" and "nan(chars…)" are converted to NaN. Again, case is ignored. 
If chars… are provided, they are used in some unspecified fashion to select a particular representation of NaN (there can be several).

When a math function suffers a domain error, it raises the invalid exception and returns NaN....

Code:
A valid floating point number for strtod using the "C" locale is formed by an optional sign character (+ or -), followed by one of:
...........
- INF or INFINITY (ignoring case).
- NAN or NANsequence (ignoring case), where sequence is a sequence of characters, where each character is either an alphanumeric character


some additional infos..

Code:
- NAN and INF expressions are defined in 'math.h' as double/floating/long double number to C locale *(C99/C11 standarts)

# define FP_NAN FP_NAN
# define FP_INFINITE FP_INFINITE

 -- nawk uses "strtod" for convert the strings to double type

 - executes "strtod" function and
   + returns 0.000000 double for "strings" and "strings/numbers" mix char sequence
   + returns number.000000 double for "numbers" and "numbers/strings" mix char sequence (cares only first numbers from the beginning )
   + returns NaN double for beginning the "nan" (ignore case) string
   + returns Inf double for beginning the "inf" (ignore case) string

 - executes summ operations 
   
   see results : 

   'NaN + number' =  NaN (Not a Number)
 ----------------------------------------------------------
# echo nAN1 | nawk '{print $1+1}'
NaN

# echo nAN1 | nawk '{print $1*1}'
NaN

# echo nAN1 | nawk '{print $^1}'
NaN

# echo nAN1 | nawk '{print $1-1}'
NaN

# echo nAN1 | nawk '{print $1/1}'
NaN


   'Inf + number' =  Inf (infinity)
 ----------------------------------------------------------
# echo Inf1 | nawk '{print $1+1}'
Inf

# echo Inf1 | nawk '{print $1*1}'
Inf

# echo Inf1 | nawk '{print $1^1}'
Inf

# echo Inf1 | nawk '{print $1-1}'
Inf

# echo Inf1 | nawk '{print $1/1}'
Inf

Note : tested nawk on the SunOS 5.1 11.1 sun4v sparc


regards
ygemici

Last edited by ygemici; 04-29-2015 at 03:37 PM..
This User Gave Thanks to ygemici For This Post:
# 6  
Old 05-07-2015
Well, this feature might be fine for freaks, but I call it counterproductive in practice.
It hit me when I was summing up numeric columns in a command output.
Usually, commands like ps or df have a title line with words that (n)awk casts to 0; so I did not exclude it.
Until it happened that a title line had the word INFOSmilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Remove Special Characters and Numbers From a Wordlist

I sux at this type of stuff. I have a huge wordlist. I want to get rid of everything in each word except the letters. I want to remove numbers and all special characters. And since this list was created using cewl I some how picked up something like so Latin characters and would like to remove them... (6 Replies)
Discussion started by: sub terra
6 Replies

2. Shell Programming and Scripting

Delete Numbers, Spaces, Special Character from the begining of the line of a file

Hi All, I want to keep the name of the songs with their respective extensions only. Sample Code ======== 03 Choti choti gaiya choti choti gaval.mp3 03---Brazil Dhol.mp3 03 PAYALIYA .mp3 04 - Isq Risk .mp3 04%20-%20Oh%20My%20Love(wapking.in).mp3 08 - A2 - Aasan Nahin Yahan .mp3 AE... (3 Replies)
Discussion started by: Pramod_009
3 Replies

3. Shell Programming and Scripting

Nawk Problem - nawk out of space in tostring on

Hi.. i am running nawk scripts on solaris system to get records of file1 not in file2 and find duplicate records in a while with the following scripts -compare nawk 'NR==FNR{a++;next;} !a {print"line"FNR $0}' file1 file2duplicate - nawk '{a++}END{for(i in a){if(a-1)print i,a}}' file1in the middle... (12 Replies)
Discussion started by: Abhiraj Singh
12 Replies

4. Shell Programming and Scripting

Find Special/Null/Control Chars and Print Line Numbers

Hi All, This might be a basic question... I need to write a script to find all/any Speacial/Null/Control Chars and Print Line Numbers from an input file. Output something like Null Characters in File Name at : Line Numbers Line = Print the line Control Characters in File Name at : Line... (2 Replies)
Discussion started by: Kevin Tivoli
2 Replies

5. Programming

generating pair of numbers in special order

I need some help in generating pair of numbers in orders using FORTRAN code. The order is like following. loop_1: 1,2 2,3 3,4 4,5 5,6 6,7 7,8 ..... until <= 2000 loop_2: 1,3 3,5, 5,7 7,9 9,11 11,13 ........until <= 2000 loop_3: 1,4, 4,7 7,10 10,13 13,17 ..... until... (3 Replies)
Discussion started by: vjramana
3 Replies

6. Shell Programming and Scripting

the smallest number from 90% of highest numbers from all numbers in file

Hello All, I am having problem to find what is the smallest number from 90% of highest numbers from all numbers in file. I am having file with thousands of lines and hundreds of columns. I am familiar mainly with bash but I am open to whatever suggestion witch will lead to the solutions. If I... (11 Replies)
Discussion started by: Apfik
11 Replies

7. Shell Programming and Scripting

Nesting - two nawk into one nawk

hi people; this is my two awk code: nawk '/cell+-/{r=(NF==8) ? $4FS$5FS$6 : NF==7 ? $4FS$5 : $4 ;c=split(r,rr);for (i=1;i<=c;i++){if(rr != "111111"){printf($3" %d ""\n",(i+3))}}printf("")}' /home/gc_sw/str.txt > /home/gc_sw/predwn.txt nawk -F'*' '{gsub(/ *$/,"")}$0=$1$($NF-2)'... (2 Replies)
Discussion started by: gc_sw
2 Replies

8. Shell Programming and Scripting

read numbers from file and output which numbers belongs to which range

Howdy experts, We have some ranges of number which belongs to particual group as below. GroupNo StartRange EndRange Group0125 935300 935399 Group2006 935400 935476 937430 937459 Group0324 935477 935549 ... (6 Replies)
Discussion started by: thepurple
6 Replies

9. Shell Programming and Scripting

NAWK - seach pattern for special characters - } dbl qt - sng qt

i'm puzzled.... trying to look for the pattern }"'. but the below code returns to me the message below (pattern is curley queue + dbl qt + sng qt + period) nawk -v pat="\}\"\'\."' { if (match($0, pat)) { before = substr($0,1,RSTART-1); ... (11 Replies)
Discussion started by: danmauer
11 Replies

10. Shell Programming and Scripting

how to access values of awk/nawk variables outside the awk/nawk block?

i'm new to shell scripting and have a problem please help me in the script i have a nawk block which has a variable count nawk{ . . . count=count+1 print count } now i want to access the value of the count variable outside the awk block,like.. s=`expr count / m` (m is... (5 Replies)
Discussion started by: saniya
5 Replies
Login or Register to Ask a Question