2015-08-24 41 views
0

[求助14.04,GNU awk中4.0.1]AWK数值变量当作字符串

我有一种奇怪的问题...我分配数字值,即从输入文件中检索,以自定义变量。当我打印它时,它显示正确,打印它的长度显示正确的位数。
但是,当我在一个循环中使用变量时,当索引变得大于我的变量的最高有效位时,我的循环停止。

我试过一个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到可变。就我而言,最好的地方就在循环之前,因为样本在AWK脚本的主体中被重写。谢谢。

+0

变量'sample'是否可能包含回车符?如果输入文件是在Windows上创建的,并且$ 24是该行中的最后一个字段,则可能会发生这种情况。当然,在这种情况下,长度(样本)将是5而不是4,所以你应该注意到,如果这是你如何显示长度。 – rici

+0

或编辑您的问题,以包括再现问题(不是8092行!)的最小数据集以及来自该输入的预期输出。祝你好运。 – shellter

回答

1

awk根据变量中保存的值决定变量的类型。你可以强制它键入你想要的方式,虽然它有点hackey(虽然不是所有东西)。

尝试在命中for循环之前向变量中添加0。例如,​​。现在,无论您在打线之前想什么,现在都会将您的号码视为一个号码,并且您的for循环应按预期执行。

奇怪的是,它完全在执行,并在9次迭代中停止....它表明它可能已经正确地处理它,并且您可能会认为该值为8092,实际上是9。另外,在for循环中打印的内容应该永远不会执行。希望它不会输出。

2

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

我看不出有什么samples变量真正,但如果要强制的东西被评价为一个数字,你开始你的循环之前,你也许可以简单加零的变量即:

samples = $24 + 0; 

另外,如果您的源数据从一个DOS/Windows机器来了,有行结束,其中包括回车(\r\n)和$24是在每行的最后一个字段,那么你可能会比较i24\r ,这可能不会给你你期望的结果。

,看看有什么在输入数据真的,尝试:

cat -vet samples | less 

如果在$在每一行结束前看到^M,然后输入文件包含回车,你应该处理它在要求awk解析其内容之前恰当地进行。

事实上,我认为这是很清楚,因为你的输入数据与字符“8”开头,你的循环停止九号迭代,你的samplesi比较,而不是一个号码。