在awk中使用变量和数组

在awk中使用变量和数组,awk,Awk,到目前为止,我有一个相当长的脚本,不能真正设法让这个awk命令工作。我有这个循环: echo "$numberoflipids" # 1 for (( i=0 ; i<$numberoflipids ; i++ )) do echo "${nol[$i]}" # POPC echo "$pr" # 5 awk -v lipid="${nol[$i]

到目前为止,我有一个相当长的脚本,不能真正设法让这个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命令的旧帖子:)

而不是
~
操作符(
/…/
需要一个文本正则表达式;不能在其中使用变量),请使用
匹配
函数

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

您需要删除
/
中的
/
,此时您要匹配的是文本模式
/lipid/
,而不是变量的内容

更改:

$4~/lipid/
致:


使用
match
比简单地删除
/
有什么好处吗?可能没有。我不经常使用
awk
,忘记了它的工作原理。嘿,这里也有同样的评论。。。我觉得给awk加两个变量是行不通的。。。在不同的星座中尝试了几次。。。还研究了关于awk和变量的stackoverflow问题,但我从未见过2个变量…:/--sry enter已经发送了评论…我已经进行了很多尝试,我想不可能给awk 2个变量…一点也不,你可以做
-va=1-vb=2
没问题。也许你想把整个数组传递给awk?如果是这样的话,看看这个问题:哈哈,我已经试过了,现在它起作用了。。。但是现在它没有创建filec-。-我正在失去理智,现在我的代码看起来是这样的:awk-v lipid=“POPC”-v threshold=“5”$4~lipid&&$NF>threshold{print>“awkrm.pdb”;next}{print>“tmp”}双层CG\u ordered.pdb&&mv tmp awk2patch.pdb如果你有新问题,最好问一个新问题,而不是使用答案下面的注释。也许你能自己解决这个问题。不管怎样,原来的问题已经解决了,所以你应该接受答案。是的,你是对的:)非常感谢你花了这么多时间
$4~/lipid/
$4~lipid