这一次花了我一晚上的时间。
假设您有一个文件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的八进制表示,并与它一起运行。
两个问题:
发布于 2017-03-07 14:06:48
awk中的awk数。2495是八进制数4677的十进制值。0本身之外,没有以0开头的十进制数。顺便说一下,思想上的版本
awk '{if($1==4677){print $0;}}' file是
awk '$1==4677' file发布于 2017-03-07 14:08:44
我可以提出两个选择,你可以用引用你想要的键来做字符串匹配,这样"04677“就不匹配了。
$ awk '$1=="04677"' file或者,如果您知道您的键是数字的,则可以添加零以转换为十进制。
$ awk '$1==04677+0' file发布于 2017-03-07 16:44:02
当你写$1==04677而不是$1==4677时,告诉 awk将04677作为一个八进制数来处理,就像你写$1==0x4677时,你会告诉awk把它当作十六进制,而对于$1==4677"",你会告诉awk把它当作字符串对待。如果你不想那样做,那就别那么做。
更新: wrt您在@karakfa's answer下所作的评论
这个问题源于在脚本中运行awk,其中键04677是字符串,但是文件有一个数字第一列(没有前导零)。"04677“选项不能工作,因为文件上的字符串不包含前面的0。我原以为如果我把它放在数字里,这不会有什么关系,但是八进制转换让我措手不及。我相信04677+0选项在这种情况下会很好。
您刚才在评论中描述的是一个与您在问题中所述的完全不同的问题。现在,您不再将十进制与八进制进行比较,而是将数字与字符串进行比较,在这种情况下使用的操作是字符串比较(参见https://www.gnu.org/software/gawk/manual/gawk.html#Typing-and-Comparison),因此4677 != "04677",因为4677的第一个字符是"4",而04677的第一个字符是"0"。它与数字的八进制表示没有任何关系。是的,使用"04677"+0可以工作,因为这会将字符串转换为数字(4677),因此您将得到一个数字,而不是字符串,比较。
https://stackoverflow.com/questions/42650311
复制相似问题