我试图在一系列地球物理数据中保留'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?
答案 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()),因此最好避免使用。