Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将AWK数值变量视为字符串_Linux_Ubuntu_Gawk - Fatal编程技术网

Linux 将AWK数值变量视为字符串

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; }

[Ubuntu 14.04,GNU Awk 4.0.1]

我有一个奇怪的问题。。。我将从输入文件中检索的数值指定给自定义变量。当我打印它时,它会正确显示,并且打印它的长度会显示正确的位数。
然而,当我在循环中使用变量时,当索引大于变量的最高有效位时,循环停止

我尝试了一个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