检查列是否浮动

检查列是否浮动

我有一个要求,我想检查一列是否是浮动的。如果它是一个浮点数,则不做任何其他与 的连接.00

文件:

2017 47.0000 0.783333 0.2500
1663 1920.0000 32 8.0000

预期输出:

2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000

命令:

awk -F" " '{if ($9=="^[0-9]") {print  $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7$8} else {print  $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7}}' | head -1

答案1

awk '$3 !~ /\./ { sub($3, $3 ".00") } { print }' columns

显然,这个建议是基于样本输入的。它的工作原理如下:如果第三列(OP中的代码使用第九列,但示例输入不是那么长)不包含文字点,则将第三列替换为第三列加上文字字符串.00(换句话说:将字符串附加到列中)。然后打印该行,无论是否匹配。这个命令被1一些用户缩写为,但我发现这有点太神秘了。

请注意,此解决方案是不安全的,因为它使用字符串替换而不是替换列本身。

答案2

这会在第一列之后的任何列中查找整数并添加.00

$ awk '{for (i=2;i<=NF;i++) if (!($i ~ /[.]/))$i=$i ".00"} 1' input
2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000

怎么运行的

  • for (i=2;i<=NF;i++)

    这将启动一个字段循环,从第二个字段 开始,i=2一直到最后一个字段i=NF

  • if ( !($i ~ /[.]/))$i=$i ".00"

    对于每个i循环,我们检查第 i 个字段 是否$i包含句点。如果是,则($i ~ /[.]/)评估结果为 true。然而,我们否定该结果:仅当字段确实!($i ~ /[.]/)时才为真i不是包含句号。如果是这样,我们添加.00到 field 的末尾i

    if语句是循环中唯一的语句for

  • 1

    这是 awk 的 print-the-whole-line 的神秘简写。

相关内容