2010-04-13 9 views
0

J'ai un script que quelqu'un de SO a aimablement fourni pour résoudre un problème que j'avais, Cependant, j'ai quelques problèmes pour l'obtenir travailler sur OSX.OSX, G/AWK, Bash - "déclaration illégale, chaîne non terminée" et pas de sortie de fichier

gawk --version 
GNU Awk 3.1.6 

awk --version 
awk version 20100208 

La source d'origine est:

awk -F, -vOFS=, -vc=1 ' 
NR == 1 { 
    for (i=1; i<NF; i++) { 
     if ($i != "") { 
      g[c]=i; 
      f[c++]=$i 
     } 
    } 
} 
NR>2 { 
    for (i=1; i < c; i++) { 
     print $1,$2, $g[i] > "output_"f[i]".csv 
    } 
}' data.csv 

Quand je lance le script lui donne l'erreur suivante:

awk: syntax error at source line 12 
context is print $1,$2, $g[i] > >>> "output_"f <<< [i]".csv 
awk: illegal statement at source line 13 

De l'apparence de celui-ci la variable de [i] n » t été modifié dans le fichier de sortie, mais je ne sais pas pourquoi.

Si je change AWK à gawk et exécuter le script original est ici la sortie:

gawk: cmd. line:11:    print $1,$2, $g[i] > "output_"f[i]".csv 
gawk: cmd. line:11:            ^unterminated string 

Je modifier la ligne correspondante pour fixer la chaîne non terminée

print $1,$2, $g[i] > "output_"f[i]".csv" 

Ensuite, il traverse bien ne produit aucune erreur, mais il n'y a aucun fichier de sortie.

Des idées? J'ai passé la majeure partie de la nuit dernière et ce matin, je débordais.

Un fichier d'entrée exemple:

,,L1,,,L2,,,L3,,,L4,,,L5,,,L6,,,L7,,,L8,,,L9,,,L10,,,L11, 
Title,r/t,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,neede d,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst 
EXAMPLEfoo,60,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
EXAMPLEbar,30,6,6,12,6,7,14,6,6,12,6,6,12,6,8,16,6,7,14,6,7.5,15,6,6,12,6,8,16,6,0,0,6,7,14 
EXAMPLE1,60,3,3,3,3,5,5,3,4,4,3,3,3,3,6,6,3,4,4,3,3,3,3,4,4,3,8,8,3,0,0,3,4,4 
EXAMPLE2,120,6,6,3,0,0,0,6,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
EXAMPLE3,60,6,6,6,6,8,8,6,6,6,6,6,6,0,0,0,0,0,0,6,8,8,6,6,6,0,0,0,0,0,0,0,10,10 
EXAMPLE4,30,6,6,12,6,7,14,6,6,12,6,6,12,3,5.5,11,6,7.5,15,6,6,12,6,0,0,6,9,18,6,0,0,6,6.5,13 

Et l'exemple eteint devrait être

Donc, pour L1 un exemple eteint ressemblerait à ceci:

EXAMPLEfoo,60,6 
EXAMPLEbar,30,6 
EXAMPLE1,60,3 
EXAMPLE2,120,6 
EXAMPLE3,60,6 
EXAMPLE4,30,6 

Et pour L2:

EXAMPLEfoo,60,0 
EXAMPLEbar,30,6 
EXAMPLE1,60,3 
EXAMPLE2,120,0 
EXAMPLE3,60,6 
EXAMPLE4,30,6 
+0

Si vous prenez la redirection et le nom du fichier, obtenez-vous la sortie sur stdout? –

+0

Oups! Cette citation de fermeture manquante était * mon * typo dans [ma réponse] (http://stackoverflow.com/questions/2621549/creating-multiple-csv-files-from-data-within-a-csv-file/2622254#2622254). Je le réparerai. –

+0

Retiré à la fois la redirection et le nom de fichier, rien d'autre qui est impair. Mettez également le fichier .csv à dos2unix pour supprimer les problèmes de fin de ligne et de fin de fichier, mais toujours pas de sortie. Ce qui pour être honnête je trouve vraiment étrange. – S1syphus

Répondre

1

Je vois deux problèmes (sur la plate-forme OS X):

  1. La commande awk sous OS X ne prend pas en charge l'indicateur -v. Nous pouvons le réparer en utilisant le pattern BEGIN.
  2. Le système d'exploitation OS X awk n'aime pas le fichier de sortie construit dans la ligne d'impression.

Voici ma solution qui semble fonctionner à la fois sous Mac OS X Snow Leopard et Red Hat Linux 4.x:

awk -F, ' 
BEGIN { OFS=","; c=1 } # FIX problem 1 
NR == 1 { 
    for (i=1; i<NF; i++) { 
     if ($i != "") { 
      g[c]=i; 
      f[c++]=$i 
     } 
    } 
} 
NR>2 { 
    for (i=1; i < c; i++) { 
     outfile=sprintf("output_%s.csv", f[i]) # FIX problem 2 
     print $1,$2, $g[i] > outfile 
    } 
}' data.csv 
+0

Selon Apple [page de manuel pour AWK] (http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/awk.1.html), le ' L'option -v' * est * prise en charge. Et l'OP a supprimé la redirection et n'a toujours pas de sortie. Quelque chose d'autre * se passe. –

+0

Dennis: Oui, la page de manuel (au moins sur Snow Leopard) a déclaré que -v est supporté, mais j'ai essayé un simple awk -vmyvar = 5 '{BEGIN print myvar}' et cela ne fonctionne pas, se plaignant "awk: invalid -v option" –

+0

Je suppose que c'est juste une faute de frappe ici, mais le "BEGIN" appartient à l'extérieur des accolades. Essayez un espace entre '-v' et' myvar' pour voir si cela fait une différence –

Questions connexes