防止awk将从0开始的字符串转换为oct
这一次让我睡了一夜 假设您有一个文件a_file.txt,如下所示防止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
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
中的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