Linux Awk正在将“nan”转换为零
我正试图在一系列地球物理数据中保存“nan”。我使用以下代码作为linux字符串的一部分:Linux Awk正在将“nan”转换为零,linux,awk,printf,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?在awk中,如果我们对nan字符串进行数学计算,字符串将被转换为零,同样对于printf也是如此。见示例: ken
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?在awk中,如果我们对nan字符串进行数学计算,字符串将被转换为零,同样对于printf也是如此。见示例:
kent$ awk 'BEGIN{n="nan";printf "%d : %f : %s\n",n,n,n}'
0 : 0.000000 : nan
如果要使用printf,则需要动态定义格式%s或%d/%f,最多为$1、$2。。。。您可以使用正则表达式进行检查,例如^[0-9.]+$检查数字不是很严格,正如示例所示,或者与nan进行比较,如tolower$1==nan
您还可以考虑首先用检查来构建字符串,然后在最后打印所有的字符串。
< P>使用GWK的POSIX版本应该遵循肯特的例子gawk --posix 'BEGIN{n="NaN";printf "%d : %f : %s\n",n,n,n}'
打印出来
nan : nan : NaN
NaN这个词和其他任何字符串一样,只是一个字符串。将其视为任何其他内容都会破坏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选项查看可能是您想要的:
$ gawk -M 'BEGIN{n="NaN";printf "%d : %f : %s\n",n,n,n}'
nan : nan : NaN
如果所有其他功能都失败了,您可以使用-posix,但这会禁用所有非常有用的特定于gawk的功能,例如gensub,因此最好避免使用它