2010-09-01 6 views
2

Я пытаюсь обработать 10 файлов с awk в моем скрипте, и я получаю следующую ошибку.Ошибка обработки нескольких файлов

$ 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) 

Кто-нибудь знает, как это исправить? Он отлично работает с < 10 файлами, но мне нужно использовать его 10 или 50 файлов.

Вот мой код

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

Это не проблема с awk. Это проблема оболочки. $ 10 - первый аргумент с 0 после того, как это не 10-й аргумент для скрипта. Я предлагаю добавить тег для используемой оболочки. У вашей оболочки может быть что-то, чтобы повторить всю командную строку вместо одного аргумента. – bbadour

+4

Вы, вероятно, должны просто использовать '' $ @ "', а не перечислять все эти позиционные параметры '$ 1 $ 2 ...'. – Cascabel

ответ

5

Когда вы нажмете аргумент 10 и выше, вы должны использовать фигурные скобки, например

${10} 
1

С небольшой модификации кода вы можете использовать любое количество файлов, вам необходимо

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

Таким образом, вы можете ввести любое количество файлов в ваш awk-скрипт. Он будет обрабатывать и пустые файлы. Если вы хотите пропустить пустые файлы, вы можете использовать это:

awk 'FNR==1{++nfiles} 
... 
} "[email protected]" 
Смежные вопросы