Linux 将AWK数值变量视为字符串
[Ubuntu 14.04,GNU Awk 4.0.1] 我有一个奇怪的问题。。。我将从输入文件中检索的数值指定给自定义变量。当我打印它时,它会正确显示,并且打印它的长度会显示正确的位数。Linux 将AWK数值变量视为字符串,linux,ubuntu,gawk,Linux,Ubuntu,Gawk,[Ubuntu 14.04,GNU Awk 4.0.1] 我有一个奇怪的问题。。。我将从输入文件中检索的数值指定给自定义变量。当我打印它时,它会正确显示,并且打印它的长度会显示正确的位数。 然而,当我在循环中使用变量时,当索引大于变量的最高有效位时,循环停止 我尝试了一个For循环,现在又尝试了一个While循环,两者都遇到了相同的问题 对于我正在处理的文件,samples包含值8092,循环在第9次迭代时停止 #!/usr/bin/awk -f BEGIN { samples = 0; }
然而,当我在循环中使用变量时,当索引大于变量的最高有效位时,循环停止 我尝试了一个For循环,现在又尝试了一个While循环,两者都遇到了相同的问题 对于我正在处理的文件,
samples
包含值8092,循环在第9次迭代时停止
#!/usr/bin/awk -f
BEGIN {
samples = 0;
}
{
...
samples = $24;
}
END {
i = 1;
while (i <= samples ) {
if (i>samples) { print "This is the end.\n " i " is bigger than " samples;}
i++;
}
}
#/usr/bin/awk-f
开始{
样本=0;
}
{
...
样本=$24;
}
结束{
i=1;
而(i samples){print“到此结束。\n“i”大于“samples;”
i++;
}
}
我对AWK非常陌生,不明白为什么会发生这种情况。在阅读了大量教程之后,我的印象是AWK能够根据需要在数字的字符串和数字表示之间进行转换
有人能帮我看看我做错了什么吗
解决方案
答案是,正如JNevill&ghoti所建议的,将0添加到变量中。在我的例子中,最好的位置就在循环之前,因为samples`在AWK脚本的主体中被重写。谢谢。awk根据变量中的值决定变量的类型。您可以强制它以您想要的方式键入,尽管它有点骇客化(但不是全部) 在执行for循环之前,请尝试将0添加到变量中<例如,代码>$sample=$sample+0。现在,不管awk在您点击该行之前是怎么想的,它现在都会将您的数字视为一个数字,并且您的
for
循环应该按预期执行
奇怪的是,它正在执行,并在9次迭代中停止。。。。这表明它可能已经正确地处理了它,您可能假设值是8092,而实际上是9。此外,for循环中的打印位永远不会执行。希望它不会输出该值。awk根据变量中保存的值来决定变量的类型。您可以强制它以您想要的方式键入,尽管它有点骇客化(但不是全部) 在执行for循环之前,请尝试将0添加到变量中<例如,代码>$sample=$sample+0。现在,不管awk在您点击该行之前是怎么想的,它现在都会将您的数字视为一个数字,并且您的
for
循环应该按预期执行
奇怪的是,它正在执行,并在9次迭代中停止。。。。这表明它可能已经正确地处理了它,您可能假设值是8092,而实际上是9。此外,for循环中的打印位永远不会执行。希望它不会输出该值。awk根据变量中保存的值来决定变量的类型。您可以强制它以您想要的方式键入,尽管它有点骇客化(但不是全部) 在执行for循环之前,请尝试将0添加到变量中<例如,代码>$sample=$sample+0。现在,不管awk在您点击该行之前是怎么想的,它现在都会将您的数字视为一个数字,并且您的
for
循环应该按预期执行
奇怪的是,它正在执行,并在9次迭代中停止。。。。这表明它可能已经正确地处理了它,您可能假设值是8092,而实际上是9。此外,for循环中的打印位永远不会执行。希望它不会输出该值。awk根据变量中保存的值来决定变量的类型。您可以强制它以您想要的方式键入,尽管它有点骇客化(但不是全部) 在执行for循环之前,请尝试将0添加到变量中<例如,代码>$sample=$sample+0。现在,不管awk在您点击该行之前是怎么想的,它现在都会将您的数字视为一个数字,并且您的
for
循环应该按预期执行
奇怪的是,它正在执行,并在9次迭代中停止。。。。这表明它可能已经正确地处理了它,您可能假设值是8092,而实际上是9。此外,for循环中的打印位永远不会执行。希望它不会输出这些信息。Awk并没有在表示之间进行精确的“转换”,它只是使用您提供的任何内容,根据使用情况调整上下文。因此,在计算布尔值时,任何非零数字的计算结果均为TRUE,除“0”
之外的任何字符串的计算结果均为TRUE
我看不出您的samples
变量中到底有什么,但是如果您想在开始循环之前强制将事物作为一个数字进行计算,您可以简单地将零添加到变量中,即:
samples = $24 + 0;
此外,如果源数据来自DOS/Windows计算机,并且具有包含回车符的行尾(\r\n
),并且$24
是每行的最后一个字段,则您可能会将i
与24\r
进行比较,这可能不会给出您期望的结果
要查看输入数据中的真实内容,请尝试:
cat -vet samples | less
如果在每行末尾的$
前面看到^M
,则输入文件包含回车符,您应该在要求awk解析其内容之前对其进行适当处理
事实上,我认为很明显,由于您的输入数据以字符“8”开始,循环在第9次迭代时停止,因此您对I
与示例的比较是字符串之一,而不是数字。Awk并不完全在表示之间“转换”,它只是使用您给出的任何表示,根据使用情况调整上下文。因此,在计算布尔值时,任何非零数字的计算结果都为TRUE,除“0”
之外的任何字符串的计算结果都为TRUE