2016-01-28 4 views
0

Я новичок в сценариях ksh и высоко ценю любую помощь. мне нужно разобрать файл данных, который выглядит следующим образом:Как запустить скрипт оболочки из команды awk

$ cat data.txt 
P1`/tmp/s1.ksh 
P2`/tmp/s2.ksh 
P3`/tmp/s3.ksh 

Здесь P1, P2, P3 являются имена параметров, за которыми следуют имена сценариев, которые вычисляют значения для этих параметров.

Фиктивные скрипты выглядеть следующим образом:

$ cat s1.ksh 
!/bin/ksh 
echo "v1" 

В конце концов, мне нужно, чтобы запустить эти сценарии и сцепить их результаты с именами параметров и производить строку, которая выглядит следующим образом:

P1=v1 P2=v2 P3=v3 

Я пытаюсь использовать awk для этого. Как я понял, system() должен запускать скрипты и выводить их вывод в результирующую строку.

$ awk -F\` '{ printf("%s ",$1); system("eval \"$(cat "$2")\"") }' /tmp/data.txt 

Но это только печатает имена параметров

P1 P2 P3 

Я проверил, если я разобрал data.txt правильно

$ awk -F\` '{ printf(" %s=",$1); printf("eval \"$(cat %s)\"", $2) }' /tmp/data.txt 

Выход

P1=eval "$(cat /tmp/s1.ksh)" P2=eval "$(cat /tmp/s2.ksh)" P3=eval "$(cat /tmp/s3.ksh)" 

Итак, я ожидайте, что система() должна выполнить последовательность g и конкатенировать его вывод с результирующей строкой.

$ eval "$(cat /tmp/s2.ksh)" 

Не могли бы вы мне помочь и объяснить, почему я не получил значения v1, v2, v3 из сценариев. Возможно, есть лучший способ, чем использовать awk для решения моей задачи.

+0

На самом деле я попробовал это, и она работала на моем Ubuntu 14.04. Я получил ожидаемый результат. Кстати, shebang в начале скриптов должен начинаться с #: '#!/Bin/ksh' – midihenry

+0

Это звучит как проблема XY (http://meta.stackexchange.com/questions/66377/what- это-The-ху-проблема). Измените свой вопрос, чтобы показать четкий ввод проб и ожидаемый результат, и мы можем помочь вам сделать это правильно, независимо от того, что это такое. –

+0

Эд Мортон, похоже, вы не читали мой пост. Были входные данные и ожидалось выход. – Anna

ответ

0

Это может работать:

echo $(
while IFS=\\` read p sc 
do 
    $sc $p 
done < data.txt) 

петля оболочка разбивает строки в файл и запускает каждый сценарий с каждыми парами. Echo $() - это запустить цикл и собрать его вывод, а также эхо-сигнал, который влияет на удаление новых строк.

0

Это работает для меня:

$ nawk -F\` '{ printf("%s ",$1); system("eval "$2) }' /tmp/data.txt 

Он производит:

P1 v1 
P2 v2 
P3 v3 
Смежные вопросы