我有一个简单的问题,对我来说已经消耗了一天的大部分时间.简而言之,我试图从字符串中删除前导零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
Run Code Online (Sandbox Code Playgroud)
现在,我已经看到许多解决方案提供了各种sed命令来"预处理"并删除前导零.不幸的是,对我来说一个完全有效的输入是0000,哪个基于字符串的解决方案会崩溃为空字符串.
简而言之,awk无论前导零如何,我如何强制将其读取的变量视为十进制?
我在原帖中忘记提及的事情:我正在努力合并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
Run Code Online (Sandbox Code Playgroud)
Posix要求awk使用相当于strtod将数据值转换为数字的方法,而awk我能找到的所有实现都是这样做的,除了busybox awk.(Busybox当然,并不声称与Posix兼容,但它有时是积极地不兼容的,就像在这种情况下一样.)所以{print $1 + 0}应该工作得很好,但它不会busybox awk,在输入中将允许十六进制或八进制整数数据.
.对数字附加一个强制将整数视为浮点数,并且对实际浮点数没有影响,因为strtod只有在遇到无法作为数字的一部分解码的字符时停止.当然,如果该字段不是完全数字的话也没有效果,所以如果您希望0017a转换为17a(甚至17)的字段,则此解决方案不适合您.
作为旁注,字符串连接awk的优先级低于加法的优先级(并且高于比较运算符),因此括号实际上是必需的; awk将解析print $1""+0为print $1(""+0),将字符串值附加0 $1.GNU awk手册建议你应该总是将连接括起来,除了琐碎的表达式,这对我来说是个好建议.
此外,作为我试图反向工程busybox awk的数字转换算法,我发现,它把012e3作为整数10,而不是12000两者12e3并012.e3转换为12000,虽然.busybox如果不是特殊的,那就什么都不是.
| 归档时间: |
|
| 查看次数: |
612 次 |
| 最近记录: |