Awk正在将'nan'转换为零

时间:2014-05-12 21:24:06

标签: linux awk printf

我试图在一系列地球物理数据中保留'nan'。我使用以下代码作为linux字符串的一部分:

awk 'NR>50 {printf "(%d, %d, %d) %f %f %f %F\n",$1,$2,$3*10000,$4,$5,$7,$6}'<$PST 

为什么nan会被转换为零?如何在原始数据中保留nan?有人告诉我,它可能与nan的小写字母有关,而不是NAN或NaN?

3 个答案:

答案 0 :(得分:0)

在awk中,如果我们对Nan字符串进行数学计算,字符串将转换为零,也适用于printf。见例子:

kent$  awk 'BEGIN{n="nan";printf "%d : %f : %s\n",n,n,n}'
0 : 0.000000 : nan

如果您想使用printf,则需要动态定义格式(%s or %d/%f),直至$1 ,$2 ...。您可以使用正则表达式进行检查,例如"^[0-9.]+$" (it is not very strict to check number, just as example)或与nan tolower($1)=="nan"进行比较。

您还可以考虑首先构建字符串(带有检查),然后在结尾处打印出来。

答案 1 :(得分:0)

使用带有gawk的posix版本应该可行(遵循Kent的例子)

gawk --posix 'BEGIN{n="NaN";printf "%d : %f : %s\n",n,n,n}'

打印出来

nan : nan : NaN

答案 2 :(得分:0)

&#34; NaN&#34;就像任何其他字符串一样的字符串。将其视为其他任何内容会破坏历史awk脚本功能。

你可以在它前面添加一个标志,以便gawk知道它是一个数字而不是一个字符串吗?

$ gawk 'BEGIN{n="NaN";printf "%d : %f : %s\n",n,n,n}'
0 : 0.000000 : NaN

$ gawk 'BEGIN{n="+NaN";printf "%d : %f : %s\n",n,n,n}'
nan : nan : +NaN

$ gawk 'BEGIN{n="-NaN";printf "%d : %f : %s\n",n,n,n}'
nan : nan : -NaN

或者,使用-M选项(请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Gawk-and-MPFR)可能是您想要的:

$ gawk -M 'BEGIN{n="NaN";printf "%d : %f : %s\n",n,n,n}'
nan : nan : NaN

如果所有其他方法都失败,您可以使用--posix,但这会禁用所有非常有用的特定于gawk的功能(例如gensub()),因此最好避免使用。