2012-04-22 11 views
0

У меня есть следующий сценарий AWK:AWK/Баш, как включить имя файла в AWK

#! /bin/awk -f 

BEGIN { FS = ":" } 

{ print $1 " " $2 " " $3 " " $4 " " } 

Я хочу, чтобы закодировать Баш скрипт с «#/бен/Баш!», Но мне нужно, чтобы включать в себя файл с ним; так как программа отображает файлы.

#! /bin/bash 

awk -f, ' 
FILENAME= $1 
BEGIN { FS = ":" } 

{ print $1 " " $2 " " $3 " " $4 " " } 

' 

В приведенном выше коде я попытался включить файл, но он не работает?

ответ

0

Это трудно для меня, чтобы сказать от вопроса, но я думаю, что вы хотите

#!/usr/bin/env bash 

awk -F, ' 
{ 
    #do stuff 
}' "$1" 

, который будет работать AWK на файл, который вы передаете в сценарий оболочки.

Однако, если вы хотите заменить переменную скрипта внутри awk, вы можете выйти из строки literal, чтобы получить замену переменных. Например:

#!/usr/bin/env bash 

filename="$1" 
awk -F, ' 
{ 
    print "'"$filename"'" 
}' "$1" 

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

#!/usr/bin/env bash 

filename="$1" 
awk -F, ' 
BEGIN { 
    awksFileName="'"$filename"'" 
} 
{ 
    print awksFileName 
}' "$1" 
+0

Ну моя задача: 1. \t Написать оболочки/AWK сценария с именем search_hotels, которые могут быть запущены с любыми комбинациями опций, все или без каких-либо опций: И сделать это я должен работать с оболочкой и внутри поместить AWK , я не знаю, могу ли я сделать это с AWK. Вот почему мне нужно передать файл AWK.поэтому я могу сделать варианты для своей программы. – user1253622

+0

Я все еще не уверен, что именно вы после, но посмотрите, как я редактирую. Вы можете назначить переменные оболочки переменным awk, используя тот же трюк, который я использовал выше. –

+0

Однако проще всего использовать встроенную переменную FILENAME awk, если все, что вы хотите, знает имя файла. –

2

Не совсем понятно, что вы хотите передать здесь. Вам нужна переменная, которая получает имя файла как значение? Самый простой способ сделать это было бы использовать -v var=value:

#! /bin/bash 

awk -v MYFILENAME="$1" ' 
BEGIN { FS = ":" } 

{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " } 
' 

Обратите внимание, что FILENAME является зарезервированным переменным, вы не можете установить его.

Или вы хотите передать файлы ввода? В этом случае вы просто передать их мимо программы, как:

#! /bin/bash 

awk ' 
BEGIN { FS = ":" } 

{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " } 
' "$1" 

Опция -f должна включать в awk сценарий, кстати. Поэтому -f, попросит AWK включить файл с именем ,.

На уровне оболочки обязательно указывайте переменные с помощью "...", как в "$1", чтобы вы правильно обрабатывали имя файла с пробелами.

+0

Ну, моя задача: 1. \t Напишите скрипт shell/awk с именем search_hotels, который можно запускать с любыми комбинациями опций, все или без каких-либо опций: И для этого я должен работать с оболочкой и внутри положить AWK, i Не знаю, могу ли я сделать это с AWK. Вот почему мне нужно передать файл AWK. поэтому я могу сделать варианты для своей программы. – user1253622

+0

Почему бы не разделить его на два файла, одну часть корпуса и еще одну часть AWK? Назовем их 'myscript.sh' и' myscript.awk'. Затем из вашего сценария оболочки вы вызовете 'awk -f myscript.awk one_or_more_filenames'. – DarkDust

+0

ах: D я не думал об этом :) .. я попробую :). – user1253622

0

Вам действительно не нужно использовать bash, чтобы вытащить имя файла.

[[email protected] ~]$ cat text 
one:two:three:four 
cyan:yellow:magenta:black 
[[email protected] ~]$ cat doit.awk 
#!/usr/bin/awk -f 

BEGIN { FS=":" } 

{ 
    printf("%s %s %s %s\n", $1, $2, $3, $4); 
} 

[[email protected] ~]$ ./doit.awk text  
one two three four 
cyan yellow magenta black 
[[email protected] ~]$ 

Но, как предложил Тим, трудно понять, какие результаты вы ищете, исходя из того, что вы включили в свой вопрос. Вам действительно нужно запускать свой awk-скрипт внутри bash по другим причинам? Вам нужно, чтобы файл NAME был доступен в вашем awk-скрипте?

Более подробный вопрос, который вы предоставляете, тем точнее будут детали в ответах.