【问题标题】:Using variables and arrays in awk在 awk 中使用变量和数组
【发布时间】:2014-10-27 20:09:36
【问题描述】:

到目前为止,我有一个相当长的脚本,但无法真正让这个 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

【问题讨论】:

    标签: awk


    【解决方案1】:

    您需要从 lipid 周围删除 / - 此时您正在匹配文字模式 /lipid/ 而不是变量的内容。

    变化:

    $4~/lipid/
    

    到:

    $4~lipid
    

    【讨论】:

    • -.- sry enter 已经发送了评论...我已经经历了很多很多更多的尝试,我想给 awk 2 个变量是不可能的...
    • 完全没有,你可以做-v a=1 -v b=2没问题。也许您正试图将整个数组传递给 awk?如果是这样,请参阅此问题:stackoverflow.com/q/5400228/2088135
    • lolz 我已经尝试过了,现在它可以工作了......但现在它没有创建 filec -.- 我正在失去理智,现在我的代码看起来像这样:awk -v Lipid="POPC " -v threshold="5" '$4~lipid&&$NF>threshold{print >"awkrm.pdb";next}{print > "tmp"}' bilayer_CG_ordered.pdb && mv tmp awk2patch.pdb
    • 如果您有新问题,最好提出新问题,而不是使用答案下方的 cmets。也许您将能够自己制定解决方案。不管怎样,原来的问题已经解决了,所以你应该接受一个答案。
    • 是的,你是对的 :) 非常感谢你花费的时间
    【解决方案2】:

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

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

    【讨论】:

    • 与简单地删除/相比,使用match有什么优势吗?
    • 可能不会。我不经常使用awk,忘记了它的工作原理。
    • 嘿,这里有同样的评论...我认为给 awk 提供 2 个变量是行不通的...尝试了几次,并且在非常不同的星座中...还查看了 stackoverflow关于 awk 和变量的问题,但我从未见过 2 个变量...:/
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2022-10-14
    • 2012-04-19
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多