Chinaunix首页 | 论坛 | 博客
  • 博客访问: 265849
  • 博文数量: 54
  • 博客积分: 35
  • 博客等级: 民兵
  • 技术积分: 729
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-09 10:35
文章分类

全部博文(54)

文章存档

2014年(37)

2013年(17)

分类: LINUX

2013-12-13 11:35:44

原帖:处理前:
   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这四种,每两列中只含有其中的两种,但不一定是哪两种,请按格式处理文本(注意顺序)。

点击(此处)折叠或打开

  1. #!/bin/awk -f

  2. BEGIN{
  3.         l=split("ACDG",a,"")
  4. }

  5. NR<2{
  6.         split($0,b," ")
  7. }

  8. NR>1{
  9.         sub(/[_0-9]+/,"");
  10.         if(!f[$1]++)c[++n]=$1;
  11.         for(i=2;i<NF;i+=2){
  12.                 d[i/2,$1,$i]++;
  13.                 d[i/2,$1,$(i+1)]++
  14.         }
  15. }

  16. END{
  17.         for(i=0;++i<=n;)s=s"\t"c[i];
  18.         print s;
  19.         s="";
  20.         for(i=0;++i<=(NF-1)/2;){
  21.                 printf "%s\t",b[i];
  22.                 for(j=0;++j<=n;){
  23.                         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]];
  24.                         s=s!=""?s"\t"t:t;
  25.                         t=""
  26.                 }
  27.                 print s;
  28.                 s=""
  29.         }
  30. }


阅读(1190) | 评论(0) | 转发(0) |
0

上一篇:转置文本

下一篇:无序输出文本

给主人留下些什么吧!~~