gpt4 book ai didi

bash - 使用 awk 删除前导零给出八进制结果

转载 作者:行者123 更新时间:2023-11-29 09:43:47 25 4
gpt4 key购买 nike

背景

我有一个简单的问题,它耗费了我一天的大部分时间。简而言之,我正在尝试使用 awk 从字符串中删除前导零。 然而,在每个人都将其标记为重复之前,问题不在于如何删除前导零(这只是我想要达到的目的)。此外,这专门针对变量的读取;我很清楚输出操作的格式字符串。

问题

因此,我的问题是:每当我尝试将给定变量类型转换为整数时,awk 会读取前导零并将输入数字视为八进制字符串。我有一些简单的示例来演示以下行为:

$ echo "0012" | awk '{$1=$1+0}1'
10
$ echo "0012" | awk '{$1=+$1}1'
10
$ echo "0011" | awk '{print ($1 + 0)}'
9
$ echo "0000" | awk '{$1=$1+0}1'
0

现在,我已经看到许多解决方案提供各种 sed 命令来“预处理”并删除前导零。不幸的是,对我来说完全有效的输入是 0000,基于字符串的解决方案会折叠成一个空字符串。

问题

简而言之,我如何强制 awk 将它读取的变量视为十进制,而不考虑前导零?

引用资料

How to delete all characters but the last

strip leading zeros in awk program

Removing Leading Zeros within awk file

更新

我在原帖中忘记提及的事情:我正在尝试将 0000 合并为一个 0。此外,我的理想解决方案是 awk - 仅由于我的环境的精简性质(介于嵌入式 Linux 和桌面操作系统之间)。有问题的 awk 由 BusyBox 1.18.1 提供,但其他一切都应该非常接近现代桌面版 Linux。

最佳答案

使用 busybox 调用的 awk,似乎可以执行以下操作:

$ printf '%s\n' 0000 0011 0012 |
busybox awk '{print ($1".")+0}'
0
11
12

Posix 要求 awk 使用 strtod 的等价物将数据值转换为数字,而我能找到的所有 awk 实现都只是那,除了 busybox awk。 (当然,Busybox 并没有声称是 Posix 兼容的,但它有时是非常不兼容的,就像在这种情况下一样。)所以 {print $1 + 0} 应该可以正常工作很好,但在 busybox awk 的情况下不是这样,它将允许输入数据中的十六进制或八进制整数。

. 附加到数字会强制将整数视为 float ,并且对真正的 float 没有影响,因为 strtod 只是在以下情况下停止它遇到一个无法解码为数字一部分的字符。当然,如果该字段不完全是数字,它也不会产生任何影响,因此如果您希望将 0017a 之类的字段转换为 17a(甚至 17),这个解决方案不适合你。

附带说明一下,awk 中字符串连接的优先级低于加法的优先级(高于比较运算符),因此括号实际上是必需的; awk 会将 print $1""+0 解析为 print $1(""+0),这会将 0 附加到字符串值$1。 GNU awk 手册建议您应该始终用括号括起连接,除非是在琐碎的表达式中,我觉得这是个好建议。

此外,当我试图对 busybox awk 的数字转换算法进行逆向工程时,我发现它将 012e3 视为整数 10,而不是 12000。不过,12e3012.e3 被转换为 12000。 busybox 如果不是特别的,那也没什么。

关于bash - 使用 awk 删除前导零给出八进制结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23377136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com