2011-07-18 2 views
0

J'ai un script UNIX qui contient un bloc nawk (Ceci est juste une partie du script UNIX et NAWK) Il a beaucoup plus de logique et le code ci-dessous devrait certainement être dans nawk) Ce bloc qui lit une valeur de recherche pour le pays code ISO à partir d'un fichier qui a des valeurs de pays et le code de pays et je fais face à un problème chaque fois qu'il ya un support dans le nom du pays() ou un apostrope 'Script shell UNIX et guillemets d'échappement pour le script AWK

Sample values 

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

Pouvez-vous m'aider à surmonter ces 2 problèmes. Pour un seul apostrope puis-je l'avoir retiré de la chaîne ou est-il possible de régler le code existant

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 

}

Répondre

0

Si ce code apparaît dans un script shell sous cette forme, vous avez besoin d'échapper à la seule citation avec une barre oblique inverse afin qu'il ne se termine pas le code nawk. Quelque chose comme:

COUNTRY_NAME = "COTE D\'IVOIRE" 

Dans le cas de parenthèses, vous devez échapper à la chaîne de sorte que nawk ne le voit pas comme un opérateur de regroupement regexp:

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

La valeur du nom du pays est affectée dynamiquement et à titre explicatif, j'avais une valeur. il peut être n'importe quel pays dans la liste des pays ISO.Pls aide – user549432

+0

Vous devriez expliquer ce que vous essayez vraiment de faire. Il semble que vous essayez vraiment de rechercher le code de pays pour chaque ligne dans /tmp/file.txt en fonction du nom complet du pays et de le placer dans /tmp/code.txt. Est-ce exact? – janm

0

De toute évidence un problème avec citant. Passez la valeur à nawk en utilisant l'option -v.

Au lieu de

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

Utilisez

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

Vous devez comprendre où le shell Unix est la manipulation de citations et où awk gère guillemets.

Étant donné votre besoin pour les guillemets simples et doubles guillemets dans le script, je pense que vous seriez mieux loti en utilisant un fichier de programme awk pour contenir le script, puis en utilisant:

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

Cela évite tous les questions de savoir si le shell va le comprendre ou non.

Si vous ne pouvez pas faire cela, alors vous devriez probablement continuer à utiliser des guillemets simples pour entourer le script awk, mais chaque occurrence de

' 

dans le script doit être remplacé par:

'\'' 

La première citation met fin à la chaîne de guillemets simples en vigueur. Le backslash-quote incorpore une seule citation dans la chaîne. La troisième citation reprend l'opération normale de chaîne de caractères entre guillemets simples, où le seul caractère spécial est guillemets simples.