这个花了我一夜的睡眠。
假设您有一个文件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的八进制表示并随之运行。
两个问题:
答案 0 :(得分:3)
以前导零开头的数字是octal
中的awk
个数字。 2495
是八进制数4677
的十进制值。
除0
本身外,没有以0
开头的小数点。
是的,它不会改变。
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
),因此您最终会得到一个数字,而不是字符串,比较。