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

防止awk将从0开始的字符串转换为oct,awk,gawk,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 你会得到你所期望的: 4

这一次让我睡了一夜

假设您有一个文件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的八进制表示,并与之一起运行

两个问题:

  • 我对结果的解释正确吗
  • 有没有办法防止awk将以0开头的数字解释为八进制数,而改用十进制解释
  • gawk有相同的行为吗?有可能改变吗
  • 以前导零开始的数字是
    awk
    中的
    octal
    数字
    2495
    是八进制数的十进制值
    4677

  • 除了
    0
    本身之外,没有以
    0
    开头的十进制数

  • 是的,它不会改变


  • 顺便说一句,意识形态版本的

    awk '{if($1==4677){print $0;}}' file
    


    我可以建议两种选择,您可以通过引用要查找的键进行字符串匹配,因此“04677”不匹配

    $ awk '$1=="04677"' file
    
    或者,如果您知道您的键是数字的,您可以添加零以转换为十进制

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

    当你写
    $1==04677
    而不是
    $1==4677
    时,你是在告诉awk把04677当作一个八进制数,就像你写
    $1==0x4677
    时告诉awk把它当作十六进制,用
    $1==4677”“
    告诉awk把它当作一个字符串。如果你不想那样做,那就不要那样做

    更新:写出您在以下内容下的评论:

    问题源于在脚本中运行awk,其中键为04677 是字符串,但文件的第一列为数字(无前导) 零)。“04677”选项将不起作用,因为 文件不包含前导0。我原以为这不会 如果我把它放在数字上也没关系,但是八进制转换让我抓狂了 警卫我相信04677+0选项在这种情况下会很好地工作


    你刚才在评论中描述的问题与你在问题中所说的完全不同。现在,您不再将十进制与八进制进行比较,而是将数字与字符串进行比较,这种情况下使用的操作是字符串比较(请参阅),因此
    4677
    !=<因为
    4677
    的第一个字符是
    “4”
    ,而
    04677
    的第一个字符是
    “0”
    。它与数字的八进制表示毫无关系。是的,使用
    “04677”+0
    会起作用,因为这会将字符串转换为数字(
    4677
    ),因此您最终得到的是一个数字,而不是字符串比较。

    我对结果的解释正确吗?
    是的,您的解释正确
    (2)
    只有我能想到
    $1==int(“04677”)
    ……
    gawk是否有相同的行为
    是的<代码>可以更改吗?不知道
    (2)$1==“04677”
    谢谢。整数转换应该可以。谢谢。问题是在脚本中运行awk时出现的,其中键04677是字符串,但文件的第一列是数字(没有前导零)。“04677”选项无效,因为文件上的字符串不包含前导0。我原以为如果我把它放在数字上,这并不重要,但八进制转换让我措手不及。我相信04677+0选项在这种情况下会很好地工作。@gvrocha该评论表示您的问题并不代表您真正的问题,因此我们一直在努力帮助您解决您没有的问题。看见
    $ awk '$1==04677+0' file