非法参考AWK数组(我有麻烦搞清楚AWK)

问题描述:

我想使用的脚本是:非法参考AWK数组(我有麻烦搞清楚AWK)

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 

有明显的错误?

+0

如果您包含一些样本输入和所需的输出,回答这些问题总是更容易。所有你需要做的是[编辑](http://stackoverflow.com/posts/14720898/edit)你的问题。 – Steve

+0

UUOC。改掉'cat'并使用'awk'...'gatk_probes.interval_list> EXOME.targets.reg'来代替。 –

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)。

+0

+1。是的,length(array)是一个gawk扩展,并且如你所示,它是不必要的,因为split(string,array,re)返回数组中元素的个数。你可以摆脱虚假的尾随分号。 –

+0

谢谢你,工作正常 – user1340048