在awk中使用变量和数组

时间:2014-10-24 13:20:39

标签: awk

到目前为止,我有一个很长的脚本,并且无法真正设法让这一个awk命令工作。我有这个for循环:

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命令对我来说非常合适...它在filea的第4列中搜索POPC,将最后一列中超过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 个答案:

答案 0 :(得分:2)

您需要从/左右移除lipid - 在您与文字模式/lipid/匹配时,而不是变量的内容。

变化:

$4~/lipid/

为:

$4~lipid

答案 1 :(得分:0)

而不是~运算符(/.../需要文字正则表达式;您不能在其中使用变量),请使用match函数。

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