2016-02-25 2 views
1

Я пытаюсь написать awk-программу для генерации SQL-запроса, используя вывод команды pipe. Вывод команды будет что-то вроде этогоawk: пытается сгенерировать запрос с помощью awk

Service name: APP1 
Service name: APP2 
Service name: APP3 
Service name: APP4 
Service name: APP5 
Service name: APP6 
Service name: APP7 
Service name: APP8 
Service name: APP9 

и результат мне нужно что-то вроде:

select 'APP1' x from dual union all 
select 'APP2' from dual union all 
select 'APP3' from dual union all 
select 'APP4' from dual union all 
select 'APP5' from dual union all 
select 'APP6' from dual union all 
select 'APP7' from dual union all 
select 'APP8' from dual union all 
select 'APP9' from dual 

Мне нужно, чтобы получить строку после «Имя службы:» строка, положить его между кавычками и поместить его в select. Первая строка должна содержать «x» после строки, а последняя строка не должна содержать объединение всех. В строке не может быть пробела. Поскольку у меня нет большого опыта работы с awk, до сих пор я не мог понять, как это сделать. меня это до сих пор:

srvctl config service -db database | grep 'Service name' | awk 'BEGIN {FS = "[:]"} 
{ gsub(/^[ \t]+|[ \t]+$/, "", $2) 
    if (NR == 1) 
    { 
     printf "'select\ \''" $2 "'\'\ x\ from\ dual\ union\ all\ '\n" 
    } 
    else 
    { 
     printf "'select\ \''" $2 "'\'\ from\ dual\ union\ all\ '\n" 
    } 
}' 

Он будет генерировать следующий вывод:

select 'APP1' x from dual union all 
select 'APP2' from dual union all 
select 'APP3' from dual union all 
select 'APP4' from dual union all 
select 'APP5' from dual union all 
select 'APP6' from dual union all 
select 'APP7' from dual union all 
select 'APP8' from dual union all 
select 'APP9' from dual union all 

Любая помощь ценится

Благодаря

ответ

2

Использование AWK вы можете сделать:

awk 'NR==1{printf "select \047%s\047 x from dual union all\n", $NF; next} 
     s{print s, "union all"} 
     {s=sprintf("select \047%s\047 from dual", $NF)} END{print s}' file 

select 'APP1' x from dual union all 
select 'APP2' from dual union all 
select 'APP3' from dual union all 
select 'APP4' from dual union all 
select 'APP5' from dual union all 
select 'APP6' from dual union all 
select 'APP7' from dual union all 
select 'APP8' from dual union all 
select 'APP9' from dual 
+1

Благодаря человек, только что протестировал и, хотя он помещает й псевдоним каждую строку, это не проблема, это работает очень хорошо для меня! – sasteck

+0

Рад, что это сработало. Я также исправил удаление «x» псевдонимов из второй строки и далее. – anubhava

+1

Огромное спасибо! Это было скорее «чистым кодом», оба подхода являются действительными sql sintaxes, спасибо, что нашли время – sasteck

1

возможно проще этого путь

$ awk -v q="'" '{print "select " q$3q (NR==1?" x":"") " from dual union all"}' file | 
    sed '$s/\w* \w*$//' 

select 'APP1' x from dual union all 
select 'APP2' from dual union all 
select 'APP3' from dual union all 
select 'APP4' from dual union all 
select 'APP5' from dual union all 
select 'APP6' from dual union all 
select 'APP7' from dual union all 
select 'APP8' from dual union all 
select 'APP9' from dual 

или

$ awk -v q="'" -v x=" x" '{print "select " q$3q x " from dual union all"; x=""}' file | 
    sed '$s/\w* \w*$//' 
+0

Интересно, это работает так же хорошо, но не возражаете ли вы объяснить часть sed? Я вижу, что вы использовали его, чтобы удалить последний союз, но не мог понять, как именно он работает. – sasteck

+0

sed удаляет последние две слова в последней строке. Это упрощает awk для создания равномерного вывода. first $ - последний указатель строки, \ w * соответствует слову, а final $ - индикатор конца строки. – karakfa

+0

Теперь я вижу, как это работает, приятно спасибо! – sasteck

1
$ awk 'BEGIN{x=" x"} NR>1{print prev " union all"; x=""} {prev="select \047" $NF "\047" x " from dual"} END{print prev}' file 
select 'APP1' x from dual union all 
select 'APP2' from dual union all 
select 'APP3' from dual union all 
select 'APP4' from dual union all 
select 'APP5' from dual union all 
select 'APP6' from dual union all 
select 'APP7' from dual union all 
select 'APP8' from dual union all 
select 'APP9' from dual 
+1

красивый код, очень краткий – sasteck

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