2012-10-26 157 views
-1

我面臨一個令人困惑的問題(至少對我而言)。我正在嘗試讀取一些CSV文件,然後提取一些值來做一些檢查和微積分。我正在使用awk來訪問文件並提取必需的字段。awk不能在bash腳本中工作

奇怪的一點是,awk語句正確運行在bash提示符下,但在腳本中運行時不起作用。作爲一個例子,我從bash提示符得到:

[email protected]:~/work$ awk -F\; '$1 == "21-08-2012" && $2 == "'17'" { print $3 }' niveles-rams.csv 
2 

nrams1=`awk -F\; '$1 == "'$fecha'" && $2 == "'$area'" { print $3 }' niveles-rams.csv` 
echo $nrams1 

不返回任何值。 CSV文件來自Excel中的窗口,所以也許可能有編碼問題,我猜?

您可以在以下網址

腳本validacio.bash和CSV文件

感謝您的幫助和耐心

+0

我建議你重新閱讀你最後一個問題的答案。 – Steve

+0

我會的,謝謝。重點在於同一個awk語句在腳本中處理不同的輸入文件,但我試圖將所有文件保存爲UTF8,以避免由於使用Excel生成這些事實而導致問題。 – pacomet

+1

請參閱http://cfajohnson.com/shell/cus-faq-2.html#Q24瞭解如何將shell變量的值傳遞給awk腳本,以及由@JacekDominiak在這裏發佈的答案。 –

回答

1

你的情況將是:

nrams1=`awk -F";" -v fecha=$fecha -v area=$area '$1 == fecha && $2 == area { print $3 }' niveles-rams.csv` 

神山ķ帕瓦爾 menitioned正確的方法

+0

總是引用你的shell變量,除非你有一個非特定的原因不。 fecha =「$ fecha」和area =「$ area」。 –

+0

這是什麼原因?我可以想象,如果你連接它們......你可以使用大括號作爲_ $ {fecha} _ ...但引用?口譯員有什麼不同? –

+1

巨大的差異。在引號內你可以得到變量包含的字符串。沒有引號,你會得到應用分詞,文件名擴展等的結果。等等包含在變量中。作爲一個簡單的例子,在可寫目錄中試試這個:> tmp1; > tmp2; VAR = 「TMP *」;回聲「$ var」; echo $ var –

0

在您的文件(niveles-rams.csv)日期字段中使用/(斜槓)符號,但在bash腳本 - (減號)符號。也許這就是原因。

+1

對不起,上傳舊版本。這不是問題,謝謝 – pacomet

0

謝謝大家回答和評論的問題。我的腳本中的問題是一個awk問題,但不是我問的問題。我的錯誤是,我沒有正確讀取「區域」變量:

i=1 
while [ $i -lt 32 ]  
    do 
    let i=$i+1 
    area=`awk 'BEGIN { FS=";" ; FNR="1" } FNR == "'$i'" {print $1}' pobles.csv` 

文件pobles.csv有沒有頭和腳本沒有正確讀取第一個記錄。然後錯誤級聯,所以最終的結果是錯誤的。現在,添加一個標題並開始從i = 2(第二條記錄)讀取它的作品。

當然,必須有一個更聰明的解決方案,但我是awk的新手,無法理解。希望我會學習更多的awk並且做到這一點。

所有的答案對我來說都非常有用,並讓我學到了一些關於awk的知識。

謝謝