我使用以下命令将 a 转换decimal value
为 a time value
:
echo "1.5" | awk -F'.' '{printf $1 ":" "%.0f", $2 / 100 * 60}'
输出:1:3
我怎样才能awk
在输出中添加尾随零,这样我就会得到:1:30
?
答案1
我不认为添加尾随 0 是一个好方法。它可能会为 as 输入生成预期的输出1.5
,但如果您需要其他输入的通用解决方案,则此方法可能不会很好地工作。
更好的方法是不拆分整数部分和小数部分,而是使用分钟,使用/
和%
运算符来计算正确的小时和分钟, 例如:
awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.5
# prints 1:30
awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.50
# prints 1:30
awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.7
# prints 1:42
awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.05
# prints 1:03
要处理负值,您可以引入一个abs
函数:
awk 'function abs(v) {return v < 0 ? -v : v}
{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< -1.7
# prints -1:42
答案2
因为你不知道你有多少个小数位,所以你不知道你需要除以100。@janos有正确的答案,但如果你坚持在小数点上分割,你需要强制转换小数部分变回小数:
echo 1.5 | awk -F'.' '{printf "%d:%02d\n", $1, ("0."$2) * 60}'
"0."$2
是字符串连接产生的字符串“0.5”。
然后乘以数字 60 即可得到分钟数。
或者,您可以根据位数找出要使用的除数
awk -F'.' '{printf "%s\t%d:%02d\n", $0, $1, $2 / 10**length($2) * 60}' << END
1
1.5
1.75
1.6666667
END
1 1:00
1.5 1:30
1.75 1:45
1.6666667 1:40
但是,不要做这两件事。