0

内部に nawk ブロックを含む UNIX スクリプトがあります (これは UNIX および NAWK スクリプトの一部にすぎません。さらに多くのロジックがあり、以下のコードは間違いなく nawk にあるはずです) 国 ISO コードのルックアップ値を読み取るこのブロック国と国コードの値を持つファイルから、国名に角かっこ () または単一のアポスロープがあるたびに問題に直面します '

Sample values

CIV@COTE D'IVOIRE
COD@CONGO, 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

}

4

3 に答える 3

1

Unix シェルが引用符を処理する場所と、Awk が引用符を処理する場所を理解する必要があります。

スクリプトで一重引用符と二重引用符の両方が必要な場合は、awkプログラム ファイルを使用してスクリプトを含め、次を使用することをお勧めします。

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

これにより、シェルがそれを理解するかどうかの問題をすべて回避できます。

それができない場合は、引き続き一重引用符を使用して awk スクリプトを囲む必要がありますが、

'

スクリプト内は次のように置き換える必要があります。

'\''

最初の引用符は、一般的な単一引用符で囲まれた文字列を終了します。バックスラッシュ引用符は、単一引用符を文字列に埋め込みます。3 番目の引用符は、通常の単一引用符で囲まれた文字列操作を再開します。ここで、唯一の特殊文字は単一引用符です。

于 2011-07-18T20:29:18.233 に答える
0

明らかに引用の問題です。オプションを使用して値を nawk に渡し-vます。

それ以外の

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

使用する

nawk -v "COUNTRY_NAME=COTE D'IVOIRE" '{
        if (COUNTRY_NAME != " "){ ...
于 2011-07-18T10:50:41.480 に答える
0

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

COUNTRY_NAME = "COTE D\'IVOIRE"

括弧の場合、nawk がそれを正規表現のグループ化演算子として認識しないように、文字列内でエスケープする必要があります。

COUNTRY_NAME = "CONGO, Democratic Republic of \\(was Zaire\\)"
于 2011-07-18T04:23:18.737 に答える