2010-09-01 4 views
2

J'essaye de traiter 10 fichiers avec awk dans mon script, et j'obtiens l'erreur suivante.Erreur lors du traitement de plusieurs fichiers

$ sh skipper.sh file1 filea fileb filec filec fileb filea fileb filec fileb awk: cmd. line:2: (FILENAME=filec FNR=7) fatal: cannot open file `file10' for reading (No such file or directory) 

Est-ce que quelqu'un sait comment le réparer? Il fonctionne très bien avec < 10 fichiers mais j'ai besoin de l'utiliser 10 ou 50 fichiers.

Voici mon code

awk -v nfiles="10" 'NR==FNR{a[$0]++;next} 
$0 in a {a[$0]++; next} 
{b[$0]++} 
END{ 
    for(i in a){ 
    if(a[i]==nfiles) { 
     print i > "output1" 
    } 
    else if(a[i]==1) { 
     print i > "output3" 
    } 
    } 
    for(i in b){ 
    if(b[i]==nfiles-1) { 
     print i > "output2" 
    } 
    } 
}' $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 
+3

Ce n'est pas un problème awk. C'est un problème de coque. $ 10 est le premier argument avec un 0 après pas un 10ème argument au script. Je suggère d'ajouter une balise pour le shell que vous utilisez. Votre shell peut avoir quelque chose à répéter toute la ligne de commande au lieu d'un seul argument. – bbadour

+4

Vous devriez probablement utiliser '" $ @ "' plutôt que d'énumérer tous les paramètres de position '$ 1 $ 2 ...'. – Cascabel

Répondre

5

Lorsque vous frappez l'argument 10 et au-dessus, vous devez utiliser des accolades, par exemple

${10} 
1

Avec une petite modification de votre code, vous pouvez utiliser un certain nombre de fichiers, Vous avez besoin

awk 'BEGIN{nfiles=ARGC-1} 
... 
} "[email protected]" 

De cette façon, vous pouvez entrer n'importe quel nombre de fichiers dans votre script awk. Il traitera également les fichiers vides. Si vous voulez ignorer les fichiers vides Vous pouvez utiliser ceci:

awk 'FNR==1{++nfiles} 
... 
} "[email protected]" 
Questions connexes