2015-01-07 1 views
4

Я пытаюсь использовать Bash для построения запроса на моем postgres db. У меня есть массив asnums, и я хочу, чтобы запросить таблицу (dcan_nodup) в базе данных (ixmaps), чтобы подсчитать, сколько строк появляются те asnums в.Bash, массив, где условия, postgres select

Последующий фрагмент кода работает, ниже один Это не.

РАБОТЫ (производит разделенных запятой CSV с ожидаемыми значениями):

declare -a carriers=(6461 17025 33139 17899 7018 5730 4466 577 6549 11489) 
echo "" 
echo "Generating CrFreqTR..." 
for asnum in "${carriers[@]}" 
do 
    echo $asnum 
    count=$(psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where asnum = '$asnum';") 
    echo $count 
    echo $asnum", "$count >> dcan_crfreq_tr.csv 
done 

не работает:

declare -a whereConditions=('asnum = 6461 or asnum = 17025' 'asnum = 33139' 'asnum = 17899' 'asnum = 7018 or asnum = 5730 or asnum = 4466' 'asnum = 577 or asnum = 6549 or asnum = 11489') 
for w in "${whereConditions[@]}" 
do 
    echo $w 

    echo psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where "$w";" 
    psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where "$w";" 
    echo "NOPE #1" 

    count=$(psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where '$w';") 
    echo $count 
    echo "NOPE #2" 
    echo $w", "$count >> dcan_crfreq_tr.csv 
done 

NOPE # 1 Результаты:

asnum = 6461 or asnum = 17025 
psql -d ixmaps -Atc select count(distinct traceroute_id) from dcan_nodup where asnum = 6461 or asnum = 17025; 
psql: warning: extra command-line argument "6461" ignored 
psql: warning: extra command-line argument "or" ignored 
psql: warning: extra command-line argument "asnum" ignored 
psql: warning: extra command-line argument "=" ignored 
psql: warning: extra command-line argument "17025;" ignored 
psql: FATAL: Ident authentication failed for user "=" 
NOPE #1 
asnum = 33139 
psql -d ixmaps -Atc select count(distinct traceroute_id) from dcan_nodup where asnum = 33139; 
psql: warning: extra command-line argument "33139;" ignored 
psql: FATAL: Ident authentication failed for user "=" 
NOPE #1 
asnum = 17899 
psql -d ixmaps -Atc select count(distinct traceroute_id) from dcan_nodup where asnum = 17899; 
psql: warning: extra command-line argument "17899;" ignored 
psql: FATAL: Ident authentication failed for user "=" 
... 

NOPE # 2 результаты:

asnum = 6461 or asnum = 17025 
ERROR: invalid input syntax for type boolean: "asnum = 6461 or asnum = 17025" 
NOPE #2 
asnum = 33139 
ERROR: invalid input syntax for type boolean: "asnum = 33139" 
... 

Что я хочу сделать, это использовать условия ИЛИ, чтобы объединить подсчеты из 2 или более из asns. Если бы я сделать это вручную, она работает просто отлично, например:

[email protected]:~/scripts$ psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where asnum = 6461 or asnum = 17025;" 
124 

Но я не могу заставить его работать в цикле Баш ...

Я подозреваю, что я либо не избежать переменной правильно , а не конкатенировать строки правильно или что-то в равной степени тривиально - я новичок bash ...

+2

$ Используется за пределами кавычек почти всегда является ошибкой в ​​bash. – Jasen

ответ

1

Ваша проблема, вероятно, что вы выходите из двойных кавычек при расширении $w.

Предполагается, w='one two'.

Сравните вывод из printf %s\\n "foo "$w" bar":

foo one 
two bar 

в printf %s\\n "foo$wbar":

foo one two bar 

Таким образом, вы не хотите

psql ... "select ... "$w"...;" 

вместо этого вы хотите

psql ... "select ... $w ...;" 
+0

Вздох, да. Я думал, что пробовал этот вариант. Поэтому я думаю, что bash делает это по-другому, чем другие языки, которые я знаю ... – cdmccann

+0

@colinsnotin Да, разделение слов не является чем-то, что касается большинства языков программирования. что, как говорится во многих «foo» $ var «bar», в любом случае не является законным. –

1

нравится это?

declare -a carriers=(6461 17025 33139 17899 7018 5730 4466 577 6549 11489) 

function join { local IFS="$1"; shift; echo "$*"; } 

echo "" 
echo "Generating CrFreqTR..." 

q= "copy (select asnum count(distinct traceroute_id) from dcan_nodup where asnum in (" \ 
    `join , "${carriers[@]"` ") group by asnum) TO STDOUT WITH CSV"; 

psql -d ixmaps -Atc "$q" >> dcan_crfreq_tr.csv 
+0

Jasen, я не могу заставить это работать - и не может действительно устранить его, так как я полностью не могу его разобрать. Баш утверждает, что ищет заключительную цитату, но они смотрят, чтобы все соответствовали друг другу. Ошибка: неожиданный EOF при поиске соответствия '' '. Это позор, поскольку он выглядит намного эффективнее, чем глупость, которую я писал – cdmccann

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