awk - 算术运算,在字段包含字符串而不是数字的情况下使用不同的格式

awk - 算术运算,在字段包含字符串而不是数字的情况下使用不同的格式

我正在尝试在单个文件中相互减去数据集。但是,当脚本命中输出值时,na输出不正确。

输入文件:

# <header>

2002    328     0.1345  2002    328     na
2002    329     na      2002    329     0.281065021
2002    330     0.9     2002    330     0.1

我当前使用的 awk 脚本是:

NR==1{print $0, " diff.\n"}
NR>2{printf("%s\t%7.6f\n", $0, $3-$6)}

其输出:

# <header> diff.

2002    328     0.1345  2002    328     na      0.134500
2002    329     na      2002    329     0.281065021     -0.281065
2002    330     0.9     2002    330     0.1     0.800000

在这种情况下,为了使分析更容易,我正在寻找输出列来显示“ na”而不是测量值。

期望的输出:

# <header> diff.

2002    328     0.1345  2002    328     na      na
2002    329     na      2002    329     0.281065021     na
2002    330     0.9     2002    330     0.1     0.800000

答案1

尝试使NR>2语句有条件,例如:

BEGIN {OFS="\t"}
NR==1 {print $0, "diff.\n"}
NR>2 {print $0, ( $3=="na" || $6=="na" ? "na" : sprintf("%7.6f", $3-$6) )}
  • 这用作$3=="na" || $6=="na"条件,即if either field three or six are "na", print "na", else print the subtraction
  • 如果不是数字的字段 3 或 6 也可能不是“ na”,您可以尝试更复杂的方法:$3 !~ /^[0-9]+(\.[0-9]+)?$/ || $6 !~ /^[0-9]+(\.[0-9]+)?$/
  • 上面还用作\t输出字段分隔符,以简化一些格式设置

相关内容