gpt4 book ai didi

linux - AWK 数字变量被视为字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:48 25 4
gpt4 key购买 nike

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

我是 AWK 的新手,不明白为什么会这样。在阅读了许多教程之后,我的印象是 AWK 能够根据需要在数字的字符串和数字表示之间进行转换。

谁能帮我看看我做错了什么?

解决方案正如 JNevill & ghoti 所建议的那样,答案是将 0 添加到变量中。在我的例子中,最好的位置就在循环之前,因为 samples` 在 AWK 脚本的主体期间被重写。谢谢。

最佳答案

Awk 并不完全在表示之间“转换”,它只是使用您提供的任何内容,并根据使用情况调整上下文。因此,在计算 bool 值时,任何非零数字的计算结果为 TRUE,除 "0" 之外的任何字符串的计算结果为 TRUE。

我无法在您的 samples 变量中看到什么是真正的,但是如果您想在开始循环之前强制将事物评估为数字,您可以能够简单地将零添加到变量即:

samples = $24 + 0;

此外,如果您的源数据来自 DOS/Windows 机器并且行尾包含回车符 (\r\n),并且 $24 是最后一个每行上的字段,那么您可能会将 i24\r 进行比较,这可能不会给您预期的结果。

要查看输入数据中的真实情况,请尝试:

cat -vet samples | less

如果您在每行末尾的 $ 之前看到 ^M,那么您的输入文件包含回车符,您应该在请求 awk 之前适本地处理它解析其内容。

事实上,我认为很明显,因为您的输入数据以字符“8”开头并且您的循环在第 9 次迭代时停止,所以您将 isamples字符串之一,而不是数字。

关于linux - AWK 数字变量被视为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32187129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com