2014-01-04 2 views
1

Я пытаюсь сгенерировать предложение WHERE для оператора SQL, используя идентификатор процесса из UNIX.Объединение значений с запятыми с помощью awk

spid=$(ps -ef|grep "LOCAL=NO"|awk {'print $2'}) 
for ((i=0; i<${#spid[@]}; i++)) 
do 
    if [ ${i} -eq 0 ]; then 
     where="'${spid[$i]}'"; 
    else 
     where=${where}", '${spid[$i]}'"; 
    fi 
done 

echo $where 

Ожидаемое ВЫВОД

'45674','4757','34535' 

Выходной ток

'45674,4757,34535' 

ответ

3

Вы упускаете набор скобок, поэтому присваивание spid создает одну строку, а не массив. Использование:

spid=($(ps -ef|grep "LOCAL=NO"|awk {'print $2'})) 
for ((i=0; i<${#spid[@]}; i++)) 
do 
    if [ ${i} -eq 0 ]; then 
     where="'${spid[$i]}'"; 
    else 
     where=${where}", '${spid[$i]}'"; 
    fi 
done 

echo $where 

=(...) обозначение, где пространства не являются технически необходимыми, определяет назначение массива.

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

Если бы мой код, я бы исправить довольно много незначительных пробелов и котирования вопросов:

spid=($(ps -ef | awk '/LOCAL=NO/ {print $2}')) 
for ((i = 0; i < ${#spid[@]}; i++)) 
do 
    if [ ${i} -eq 0 ]; then 
     where="'${spid[$i]}'" 
    else 
     where="$where, '${spid[$i]}'" 
    fi 
done 

echo "$where" 

Или, еще более вероятно, я бы потерять if тоже:

spid=($(ps -ef | awk '/LOCAL=NO/ {print $2}')) 
pad="" 
for ((i = 0; i < ${#spid[@]}; i++)) 
do 
    where="$where$pad'${spid[$i]}'" 
    pad=", " 
done 
echo "$where" 

Или awk генерировать все выходные данные:

ps -ef | 
awk '/LOCAL=NO/ { printf("%s'\''%s'\''", pad, $2; pad=", "} END { printf "\n" }' 

Единственная головоломка-пи ece внутри есть последовательность '\'', которая появляется дважды; это канонический способ вставки отдельной кавычки в одну строку с кавычками. Первая одиночная кавычка завершает текущий сегмент строки с одной кавычкой; обратная косая черта вставляет одну цитату, а другая одиночная кавычка запускает следующий сегмент одиночной кавычки. Опять же, есть другие способы сделать это, но использование двойных кавычек сложнее, чем использование одиночных кавычек.

+0

+1 Также стоит отметить, что есть некоторые проблемы с цитированием. Например, это было бы лучше: 'spid = ($ (ps -ef | awk '/ LOCAL = NO/{print $ 2}'))' – Steve

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