0

私は(少なくとも私にとっては)困惑する問題に直面しています。いくつかのcsvファイルを読み取ってから、いくつかの値を抽出してチェックと計算を行おうとしています。私はawkを使用してファイルにアクセスし、必要なフィールドを抽出しています。

奇妙な点は、awk文はbashプロンプトで適切に実行されますが、スクリプトで実行すると機能しないことです。例として、bashプロンプトから取得します。

paco@NIMBUS:~/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ファイルはWindowsのExcelから取得されるため、エンコードに問題がある可能性があります。

スクリプトvalidacio.bashファイルとcsvファイルは次のURLにあります。

あなたの助けと忍耐に感謝します

4

3 に答える 3

2

あなたの場合は次のようになります:

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

KailashKPawarが正しい方法を述べたように

于 2012-10-26T11:28:12.133 に答える
0

質問に答えてコメントしてくださった皆さん、ありがとうございました。私のスクリプトの問題はawkの問題でしたが、私が尋ねた問題ではありませんでした。私の間違いは、次の「area」変数を正しく読み取っていなかったことです。

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(2番目のレコード)から読み取りを開始すると、機能します。

確かに、よりスマートなソリューションが必要ですが、私はawkの初心者であり、要点を理解することはできません。私がもっとawkを学び、トリックをすることを願っています。

あなたの答えはすべて私にとって非常に役に立ち、awkについて何かを学ぶようになりました。

ありがとう

于 2012-10-29T10:45:30.933 に答える
0

ファイル (niveles-rams.csv) の日付フィールドでは / (スラッシュ) 記号を使用していますが、bash スクリプトでは - (マイナス) 記号を使用しています。多分それが理由です。

于 2012-10-26T11:20:32.020 に答える