2014-10-24 3 views
1

До сих пор у меня довольно длинный сценарий, и мне не удается заставить эту команду awk работать. Я получил это для цикла:Использование переменных и массивов в awk

echo "$numberoflipids"     # 1 
for ((i=0 ; i<$numberoflipids ; i++)) 
do 
    echo "${nol[$i]}"     # POPC 
    echo "$pr"       # 5 
    awk -v lipid="${nol[$i]}" threshold="$pr" '$4~/lipid/&&$NF>threshold{print >"filec";next}{print > "tmp"}' filea && mv tmp fileb 
    ## Also tried this: 
    # awk '$4~/"'${nol[$i]}'"/&&$NF>"'$pr'"{print >"patch_rmlipids.pdb";next}{print > "tmp"}' bilayer_CG_ordered.pdb && mv tmp patch.pdb 
    ## And this works... (giving the exact values) 
    # awk '$4~/"POPC"/&&$NF>5{print >"patch_rmlipids.pdb";next}{print > "tmp"}' bilayer_CG_ordered.pdb && mv tmp patch.pdb 
done 

команда третьего AWK отлично работает для меня ... он ищет колонку 4 в моем filea для РОРСА, копируют строки, которые превышают 5 в последнем столбце filec и копирует оставшиеся строки в fileb.

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

PS: Мои файлы выглядеть следующим образом:

ATOM 624 SC1 SER 288  54.730 23.870 56.950 1.00 0.00 
ATOM 3199 NC3 POP 487  50.780 27.750 27.500 1.00 3.18   
ATOM 3910 C2B POP 541  96.340 99.070 39.500 1.00 7.00   
ATOM 4125 W PW 559  55.550 64.300 16.880 1.00 0.00 

(Старое сообщение о команде AWK: bash - check for word in specific column, check value in other column of this line, cut and paste the line to new text file)

ответ

2

Вы должны удалить / со всего lipid - в тот момент, вы соответствие с буквальным рисунком /lipid/, а не содержимое переменной.

Изменение:

$4~/lipid/ 

к:

$4~lipid 
+0

Ответ на вопрос Tom Fenech. – Ueffes

+0

-.- sry enter уже отправил комментарий ... Я« пережил намного больше попыток, и я предполагаю, что это невозможно дать awk 2 переменные ... – Ueffes

+1

Совсем нет, вы можете сделать '-va = 1 -vb = 2' проблем. Возможно, вы пытаетесь передать весь массив awk? Если это так, см. Этот вопрос: http://stackoverflow.com/q/5400228/2088135 –

0

Вместо оператора ~ (/.../ требует буквального регулярных выражений, вы не можете использовать переменные внутри них), используйте функцию match.

awk -v lipid="${nol[$i]}" threshold="$pr" \ 
    'match($4, lipid) && $NF > threshold {print >"file";next}{print > "tmp"}' filea && 
mv tmp fileb 
+0

Есть ли какие-либо преимущества использования 'match' более просто удаление'/'? –

+0

Наверное, нет. Я не использую 'awk' очень часто и забываю мелочи о том, как это работает. – chepner

+0

эй, тот же комментарий здесь ... Я полагаю, что это не работает, чтобы дать 2 переменным awk ... попробовал это несколько раз и в очень разных созвездиях ... также посмотрел на вопросы stackoverflow об awk и переменных, но i «Я никогда не видел 2 переменные ...:/ – Ueffes

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