我有一个要求,我想检查一列是否是浮动的。如果它是一个浮点数,则不做任何其他与 的连接.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 的神秘简写。