2011-07-18 23 views
0

私は、nawkブロックを内部に持つUNIXスクリプトを持っています(これはUNIXとNAWKスクリプトの一部です)。もっと多くのロジックがあり、以下のコードは間違いなくnawk ) 国と国コード値を持ち、国の名にブラケット(があるたびに、私は問題に直面したファイルから国ISOコードのルックアップ値を読み込み、このブロック) または単一apostrope「AWKスクリプトのUNIXシェルスクリプトとエスケープ引用符

Sample values 

[email protected] D'IVOIRE 
[email protected], Democratic Republic of (was Zaire) 

私はこれらの2つの問題を克服するのに役立つことができますか?単一のアポストロープで文字列から削除することができますか、既存のコードを微調整することはできます。

Code 

processbody() { 

nawk '{ 

      COUNTRY_NAME = "COTE D'IVOIRE" 


      if (COUNTRY_NAME != " "){ 

         file = "/tmp/country_codes.txt" 
         FS = "@" 
         while(getline < file) { 
         if($0 ~ COUNTRY_NAME) { 
         COUNTRY_CODE = $1 
         } 
         } 
         close(file) 



      } 

printf("%s\n",COUNTRY_CODE) > "/tmp/code.txt" 

}' /tmp/file.txt 

}

答えて

0

このコードは、この形式でシェルスクリプトに表示された場合、あなたはそれがnawkのコードを終了しないように、バックスラッシュと単一引用符をエスケープする必要があります。

COUNTRY_NAME = "CONGO, Democratic Republic of \\(was Zaire\\)" 
+0

国名の値は動的に割り当てられていて、説明のために値が1つしかありません。それは、ISO諸国のリストのどの国にもなります。ヘルプヘルプ – user549432

+0

あなたが本当にやろうとしていることを説明してください。国の完全な名前に基づいて/tmp/file.txtの各行の国コードを調べて/tmp/code.txtに入れようとしているようです。あれは正しいですか? – janm

0

明らかに問題を引用して:ような何か:そのnawkのは、正規表現のグループ化演算子としてそれを見ていないので、括弧の場合

COUNTRY_NAME = "COTE D\'IVOIRE" 

は、あなたは文字列で、それをエスケープする必要があります。 -vオプションを使用して値をnawkに渡します。

代わりの

nawk '{ 
     COUNTRY_NAME = "COTE D'IVOIRE" 
     if (COUNTRY_NAME != " "){ ... 

使用

nawk -v "COUNTRY_NAME=COTE D'IVOIRE" '{ 
     if (COUNTRY_NAME != " "){ ... 
1

あなたはUnixシェルは引用符を処理していると、どこawkが引用符を処理しているかを理解する必要があります。

スクリプト内の単一引用符と二重引用符の両方のためのあなたの必要性を考えると、私は、スクリプトを含むようにawkプログラムファイルを使用して、その後、使用してオフ最善だと思う:

awk -f awk.script [file1 ...] 

これは、すべての回避しますシェルがそれを理解するかどうかの問題。

あなたがそれを行うことができない場合、あなたはおそらくawkスクリプトを囲むように単一引用符を使用し続ける必要がありますが、スクリプト内の

' 

の各発生を置き換える必要があります:

'\'' 

最初の引用符は、一重引用符で囲まれた文字列を終了します。バックスラッシュクォートは、文字列に一重引用符を埋め込みます。 3番目の見積もりは通常の一重引用符文字列操作を再開します。特殊文字は一重引用符だけです。

関連する問題