2013-03-25 3 views
0

Я некоторое время огляделся и нашел только те вопросы, которые касаются предмета, или предоставил мне ответ, который не работает. Возникает вопрос:Принятие параметров командной строки в awk

Я работаю над заданием для школы, которое требует от меня читать аргументы командной строки для awk-скрипта (что кажется странным для начала, но eh). Мы используем более старую версию Unix, и я запускаю Bash. Этот awk имеет только опции -f и -Fc. В основном, я продолжаю пытаться сделать «awk -f awk_script arg1 arg2 arg3 arg4 arg5 arg6», но каждый раз awk пытается открыть arg1 как файл, а это не так. В качестве примера я видел в других местах решения этого вопроса было:

awk 'BEGIN { print "ARGV[1] = ", ARGV[1] }' foo bar 

Он должен был напечатать «Foo», но в этой системе я только получить выход «ARGV [1] = AWK: не могу открыть Foo». Итак, в общем, есть ли способ обойти это? Может ли awk использовать эти старые аргументы командной строки и использовать их для чего-либо, кроме входных файлов? Инструктор отмечает файл, намеченный на вышеупомянутое использование (печати foo), но его программа даже не запускается, поэтому ...

Любая помощь будет принята с благодарностью.

После редактирования: Использование SunOS 5.10 и это AWK не поддерживает опцию -v, ТОЛЬКО -f и -Fc

+0

Возможно, это может быть связано с версиями вашей ОС и версией awk, потому что ... » для меня ";-)' $ awk 'BEGIN {print "ARGV [1] =" ARGV [1]}' abc' - output -> 'argv [1] = a'. Измените свой вопрос, чтобы включить вывод из 'uname -a' и' awk -version'. Удачи. (вы не можете получить ответ на -version, тогда ваш awk - довольно оригинальное оборудование;) – shellter

+0

Ха-ха, я не получил ответа от awk -version – WannabeCoder

+1

, учитывая SunOS 5.1, awk, который вы используете, «старый «awk с 1977 года». Попробуйте изменить имя, которое вы вызываете на 'nawk'. (новый awk). Книга авторов awk «Язык программирования Awk» относится к «новому» awk и была опубликована в 1988 году, но по-прежнему настоятельно рекомендуется. «Эффективное программирование на Awk» (2001) тоже великолепен и охватывает многие улучшения, сделанные для gawk (gnu-awk). Удачи. – shellter

ответ

0

Использование nawk или /usr/xpg4/bin/awk. Это более новые версии awk, которые поддерживают больше функций.

В качестве альтернативы вы можете установить еще одну версию awk, например mawk или GNU awk.

+0

Я переключил команду с «awk ....» на «nawk ...», и все сработало (достаточно близко) к тому, как я этого хотел, даже без опции -v. Спасибо за рабочее решение, но я все еще удивляюсь, почему awk не будет работать так, как должно. – WannabeCoder

+2

Вы должны использовать/usr/xpg4/bin/awk в Solaris, предпочитая nawk, поскольку nawk старше, не поддерживает POSIX и имеет меньше функций. –

+0

@ EdMorton Да, версия/usr/xpg4/bin лучше, но может быть недоступна на минимальных установках. Я перечислил несколько возможностей. – jilles

0

Возможная работа вокруг - возможно, не приемлемо - было бы использовать -v вариант awk.

awk -v arg1=foo 'BEGIN { print arg1; }' 
+0

Эта версия awk не поддерживает опцию -v (кажется, это как голые кости, так как awk может получить). – WannabeCoder

+0

@WannabeCoder Тогда версия 'awk', которую вы используете, является мусором, и вы должны использовать другую. Опция '-v' задается POSIX. Реализации, которые его не поддерживают, не могут законно даже утверждать, что они являются awk. –

1

Вы можете уменьшаете ARGC после прочтения аргументов так, что только первый (s) аргумент (ы) является (являются), которые рассматриваются awk в качестве входного файла (ов):

#!/bin/awk -f 

BEGIN { 
    for (i=ARGC; i>2; i--) { 
     print ARGV[ARGC-1]; 
     ARGC--; 
    } 
} 
… 

или в качестве альтернативы, вы можете сбросить ARGC прочитав все аргументы:

#!/bin/awk -f 

BEGIN { 
    for (i=0; i<ARGC; i++) { 
     print ARGV[ARGC-1]; 
    } 
    ARGC=2; 
} 
… 

Оба метода будет корректно обрабатывать myawkscript.awk foobar foo bar …, как если бы Foobar был единственным файлом процесс (конечно, вы можете установить ARGC на 3, если вы хотите, первые два аргумента в виде файлов и т.д.). В вашем конкретном случае кажется, что вы не хотите обрабатывать какой-либо файл, поэтому вы должны установить ARGC на 1.

Смежные вопросы