2015-08-24 46 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比較,而不是一個號碼。