原帖:处理前:
name1 name2 name3 name4 name5
MG1 A G C D C A C G A D
MG2 A G D C A C G C D A
SH_1 G G C C C C 0 0 A A
SH_2 A A 0 0 A A C C D D
SH_3 G A D D 0 0 G G 0 0
SD1 A G C D C C C G A D
SD2 0 0 D C C A C C D A
处理后:
MG SH SD
name1 2,2 3,3 1,1
name2 2,2 2,2 2,2
name3 2,2 2,2 1,3
name4 2,2 2,2 3,1
name5 2,2 2,2 2,2
处理规则:
每个"name"分别对应两列,现在想统计以MG、SD、SH开头的行分别含有字母的个数,字母只可能是A、C、D、G这四种,每两列中只含有其中的两种,但不一定是哪两种,请按格式处理文本(注意顺序)。
-
#!/bin/awk -f
-
-
BEGIN{
-
l=split("ACDG",a,"")
-
}
-
-
NR<2{
-
split($0,b," ")
-
}
-
-
NR>1{
-
sub(/[_0-9]+/,"");
-
if(!f[$1]++)c[++n]=$1;
-
for(i=2;i<NF;i+=2){
-
d[i/2,$1,$i]++;
-
d[i/2,$1,$(i+1)]++
-
}
-
}
-
-
END{
-
for(i=0;++i<=n;)s=s"\t"c[i];
-
print s;
-
s="";
-
for(i=0;++i<=(NF-1)/2;){
-
printf "%s\t",b[i];
-
for(j=0;++j<=n;){
-
for(k=0;++k<=l;)if(d[i,c[j],a[k]]!="")t=t!=""?t","d[i,c[j],a[k]]:d[i,c[j],a[k]];
-
s=s!=""?s"\t"t:t;
-
t=""
-
}
-
print s;
-
s=""
-
}
-
}
阅读(1196) | 评论(0) | 转发(0) |