防止awk将字符串从0开始转换为oct

时间:2017-03-07 14:01:33

标签: awk gawk

这个花了我一夜的睡眠。

假设您有一个文件a_file.txt,如下所示。

1000    JUC_0000    1
2494    JUC_AAAA    2
2495    JUC_BBBB1   3
2495    JUC_BBBB2   4
4676    JUC_CCCC    5
4677    JUC_DDDD1   6
4677    JUC_DDDD2   7

如果你跑

awk '{if($1==4677){print $0;}}' a_file.txt

你得到了你所期望的:

4677    JUC_DDDD1   6
4677    JUC_DDDD2   7

但是,如果你运行

awk '{if($1==04677){print $0;}}' a_file.txt

你可能会(我很惊讶)得到

2495    JUC_BBBB1   3
2495    JUC_BBBB2   4

似乎发生的事情是,awk将04677解释为2495的八进制表示并随之运行。

两个问题:

  1. 我对结果的解释是否正确?
  2. 有没有办法阻止awk将以0开头的数字解释为八进制数并改为使用十进制解释?
  3. gawk是否具有相同的行为,是否可以更改它?

3 个答案:

答案 0 :(得分:3)

  1. 以前导零开头的数字是octal中的awk个数字。 2495是八进制数4677的十进制值。

  2. 0本身外,没有以0开头的小数点。

  3. 是的,它不会改变。

  4. Btw,

    的意识形态版本
    awk '{if($1==4677){print $0;}}' file
    

    awk '$1==4677' file
    

答案 1 :(得分:3)

我可以建议两种选择,你可以通过引用你正在寻找的关键字进行字符串匹配,所以" 04677"不会比赛。

$ awk '$1=="04677"' file

或者,如果您知道您的密钥是数字,则可以添加零以转换为十进制

$ awk '$1==04677+0' file

答案 2 :(得分:2)

当你写df2.Geo.str.replace("[({':]", "") ### results in NaN # and also this: df2['Geo'] = df2['Geo'].map(lambda x: x.lstrip('{'coordinates': [').rstrip('], 'type': 'Point'')) ### results in syntax error 代替$1==04677时,你告诉 awk将04677视为八进制数字,就像你写了$1==4677你一样#39} ; d告诉awk将其视为十六进制并使用$1==0x4677你要告诉awk将其视为一个字符串。如果你不想要任何这些,那就不要那样做。

更新: wrt您在@karakfa's answer下发表的评论:

  

问题产生于在密钥04677的脚本中运行awk   是一个字符串,但文件有一个数字第一列(没有前导   零)。 " 04677"选项不起作用,因为字符串就可以了   文件不包含前导0.我原以为这不会   重要的是,如果我把它保留为数字,但八进制转换让我失望   守护。我相信04677 + 0选项在这种情况下效果很好。

您在该评论中描述的内容与您在问题中所述内容的完全不同的问题。现在,您不再将小数与八进制进行比较,而是将数字与字符串进行比较,在这种情况下使用的操作是字符串比较(请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Typing-and-Comparison),因此$1==4677"" != 4677因为"04677"的第一个字符是4677"4"的第一个字符是04677。它与数字的八进制表示没有任何关系。是的,使用"0"会有效,因为它会将字符串转换为数字("04677"+0),因此您最终会得到一个数字,而不是字符串,比较。