【问题标题】:Illegal reference to an array in awk (I am having trouble figuring out awk)非法引用 awk 中的数组(我无法弄清楚 awk)
【发布时间】:2013-02-06 03:17:18
【问题描述】:

我尝试使用的脚本是:

cat gatk_probes.interval_list |
awk '
BEGIN{
   OFS="\t";
   print "#CHR\tBP1\tBP2\tID"
}
{
   split($1,a,":");
   chr=a[1];
   if (match(chr,"chr")==0) {
      chr="chr"chr
   }
   split(a[2],b,"-");
   bp1=b[1];
   bp2=bp1;
   if (length(b) > 1) {
      bp2=b[2]
   }
   print chr,bp1,bp2,NR
}' > ./EXOME.targets.reg

我收到错误:

awk: line 1: illegal reference to array b

有什么明显的问题吗?

【问题讨论】:

  • 如果您包含一些示例输入和所需的输出,回答这些问题总是更容易。你需要做的就是edit你的问题。
  • UUOC。摆脱 cat 并改用 awk '...' gatk_probes.interval_list > EXOME.targets.reg

标签: linux unix awk


【解决方案1】:

length(b) 把你搞砸了,显然不是每个 awk 的实现都支持它。不过你可以这样做:

BEGIN
{
    OFS="\t"; 
    print "#CHR\tBP1\tBP2\tID"
}
{
    split($1,a,":"); 
    chr=a[1]; 
    if (match(chr,"chr")==0) 
    {
        chr="chr"chr
    }
    blength = split(a[2],b,"-"); 
    bp1=b[1]; 
    bp2=bp1; 
    if (blength > 1) 
    {
        bp2=b[2]
    }
    print chr,bp1,bp2,NR
}

split 返回数组中元素的数量(在本例中为 b)。

【讨论】:

  • +1 表示解决方案。是的,length(array) 是一个 gawk 扩展,正如你所展示的,它是不必要的,因为 split(string,array,re) 返回数组中元素的数量。您可以摆脱虚假的尾随分号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多