【问题标题】:Errors when passing variable to awk将变量传递给 awk 时出错
【发布时间】:2012-02-11 22:27:47
【问题描述】:

我正在尝试使用 awk -v 将外部变量传递给 awk 但就是不知道我的问题是什么!

for ((c=1;c<=22;c++));do cat hg19.gap.bed|awk -v var={chr"$c"} '{if ("$1"=="$var") print}' > $var.cbs;done

这个命令有什么问题? 谢谢

【问题讨论】:

    标签: variables awk


    【解决方案1】:

    在 awk 中,只有字段变量以 $ 开头。而且您不希望在 awk 中使用双引号。试试if ($1 == var) ...。

    使用$var实际上意味着存储在var中的索引处的字段,在这种情况下不是有效字段(但您可以使用它来遍历字段)。

    【讨论】:

      【解决方案2】:

      var={chr"$c"} 应该产生什么?

      它在这种情况下产生的是{chr1}、{chr2}、...、{chr22}。

      请注意,变量 var 是 awk 变量,而不是 shell 变量。您必须重定向到 "{chr$c}.cbs" 才能获得 22 个单独的文件。在脚本中,$var 将始终为$0,因为作为数字评估的var 是0。

      比起运行命令 22 次,您肯定可以一次完成所有操作。假设您在 MacOS X (BSD) 或任何符合 POSIX 的awk 上使用gawk (GNU Awk) 或awk,您可以这样写:

      awk '$1 ~ /\{chr([1-9]|1[0-9]|2[012])\}/ {file=$1".cbs"; print $0 >file;}' hg19.gap.bed
      

      这一次通过数据文件完成了整个工作。

      【讨论】:

        【解决方案3】:

        我假设 chr 只是一些字符串,而您想与 chr1、chr2、....进行匹配

        for ((c=1;c<=22;c++));do cat hg19.gap.bed | awk -v var=chr"$c" '"$1"==var {print}' > chr"$c".cbs;done
        

        让我知道这是否适合你。

        【讨论】:

        • $1 上没有引号,您可以完全放弃该操作,因为它是默认操作。
        猜你喜欢
        • 1970-01-01
        • 2011-04-16
        • 2018-09-28
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多