免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4219 | 回复: 8
打印 上一主题 下一主题

[文本处理] 如何用awk处理多行数据,变换为所要求的一行数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-01 19:14 |只看该作者 |正序浏览
本帖最后由 海龙小知识 于 2015-07-10 17:36 编辑

本人awk水平有限,近期遇到一个问题,求各位大神帮忙,如何用awk解决,谢谢

数据实例如下:一条空间线上的几个片段,区域分别是一行一个片段

ch1  a  5     10   +   m  
ch1  a  18   21    +  m
ch1  b  1     4     +   m
ch1  b  11   17   +   m
ch1  b  22   25   +   m
ch1  b  29   35   +   m
....
ch2  a  100     107   -   n  
ch2  a  123   130   -   n
ch2  b  91     96    -  n
ch2  b  108   122   -   n
ch2  b  131   145   -   n
ch2  b  155   165   -   n
....

生成如下结果:
ch1  1    35    +  m   6    4,6,7,4,4,7   0,4,10,17,21,28
...
ch2  91   165    -   n   6    6,8,15,8,15,11  0,9,17,32,40,64

也就是,对于m,ch1相同的数行数据,建议先按区段或者字段排序,首先打印出ch1, 然后找出第3字段中最小的值作为起点,找出第4字段中最大的值最为终点;

6 就是含有m的行数;

4,6,7,4,4,7 是这6行按照区域位置,第四字段减第三字段+1,依次计算所含有的个数,例如按照顺序
1   4, 5  10,11  17,18  21, 22  25, 29  35,
个数分别是
4-1+1=4,
10-5+1=6,
17-11+1=7,
21-18+1=4,
25-22+1=4,
35-29+1=7,
也就是分别是4,6,7,4,4,7;

而0,4,10,17,21,28则分别是第三字段中第一个是最小值本身减本身(1-1,即起点-起点),依次是5-1(也就是起点),11-1, 18-1, 22-1,29-1;

对于含有n的同样的方法

请大师,大神们帮帮忙,如何用awk解决?非常感谢

论坛徽章:
0
9 [报告]
发表于 2014-11-08 23:02 |只看该作者
回复 8# jason680
原来是调整整数位数到可容许的范围,我这样理解对吗?

   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2014-11-08 22:58 |只看该作者
回复 6# 海龙小知识

$ awk 'function p(){print s1,+S,+E,s5,s6,C,d,q}{k=sprintf("%s,%s,%09d,%09d,%s",$1,$6,$3,$4,$5);a[k]=$4-$3+1}END{t=asorti(a,b);for(n=1;n<=t;n++){split(b[n],c,",");N=c[1]","c[2];if(N!=K){if(K!="")p();s1=c[1];S=c[3];s5=c[5];s6=c[2];C=1;d=a[b[n]];q=c[3]-S;K=N;continue};C++;E=c[4];d=d","a[b[n]];q=q","c[3]-S;K=N}p()}' FILE
chromosome2 9998563 10001045 - GRMZM2G007157_T01 17 417,102,54,147,55,211,158,83,183,103,101,337,52,121,136,140,83 0,417,519,573,720,775,986,1144,1227,1410,1513,1614,1951,2003,2124,2260,2400
   

论坛徽章:
0
7 [报告]
发表于 2014-11-08 22:50 |只看该作者
回复 2# wiliiwin
根据您写的我稍微修改了下,谢谢指导,学习了
{a[$1" "$6" "$5]++;b[$1" "$6" "$5]=b[$1" "$6" "$5]" "$3;c[$1" "$6" "$5]=c[$1" "$6" "$5]" "$4}END{for(x in a){split(b[x],d," ");split(c[x],e," ");t=asort(d);s=asort(e);printf x" "d[1]" "e" "a[x]" ";for(i=1;i<=t;i++){printf (e-d+1)","};printf " ";for(j=1;j<=t;j++){printf (d[j]-d[1])","}print ""}}
   

论坛徽章:
0
6 [报告]
发表于 2014-11-08 22:46 |只看该作者
jason680大哥,你好,用你这个代码,为什么有的结果跑的不对,例如
chromosome2        CDS        10000963        10001045        -        GRMZM2G007157_T01
chromosome2        CDS        10000687        10000822        -        GRMZM2G007157_T01
chromosome2        CDS        10000514        10000565        -        GRMZM2G007157_T01
chromosome2        CDS        10000076        10000176        -        GRMZM2G007157_T01
chromosome2        CDS        9999790        9999972        -        GRMZM2G007157_T01
chromosome2        CDS        9999549        9999706        -        GRMZM2G007157_T01
chromosome2        CDS        9999283        9999337        -        GRMZM2G007157_T01
chromosome2        CDS        9999082        9999135        -        GRMZM2G007157_T01
chromosome2        CDS        9998563        9998979        -        GRMZM2G007157_T01
chromosome2        intron        10000823        10000962        -        GRMZM2G007157_T01
chromosome2        intron        10000566        10000686        -        GRMZM2G007157_T01
chromosome2        intron        10000177        10000513        -        GRMZM2G007157_T01
chromosome2        intron        9999973        10000075        -        GRMZM2G007157_T01
chromosome2        intron        9999707        9999789        -        GRMZM2G007157_T01
chromosome2        intron        9999338        9999548        -        GRMZM2G007157_T01
chromosome2        intron        9999136        9999282        -        GRMZM2G007157_T01
chromosome2        intron        9998980        9999081        -        GRMZM2G007157_T01
跑出的结果是这样的:
chromosome2   10000076     10000075    -    GRMZM2G007157_T01   17    101,337,52,121,136,140,83,417,102,54,147,55,211,158,83,183,103           0,101,438,490,611,747,887,-1513,-1096,-994,-940,-793,-738,-527,-369,-286,-103
而应该是这样的:
chromosome2   9998563       10001045   -     GRMZM2G007157_T01   17    417,102,54,147,55,211,158,83,183,103,101,337,52,121,136,140,83
0,417,519,573,720,775,986,1144,1227,1410,1513,1614,1951,2003,2124,2260,2400
谢谢您和论坛的衷心帮助,已经提高了不少,谢谢
回复 3# jason680


   

论坛徽章:
0
5 [报告]
发表于 2014-11-04 20:31 |只看该作者
好的,非常感谢,谢谢帮助。回复 3# jason680


   

论坛徽章:
0
4 [报告]
发表于 2014-11-04 20:30 |只看该作者
好的,谢谢,非常感谢帮助。回复 2# wiliiwin


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2014-11-01 21:47 |只看该作者
回复 1# 海龙小知识

$ awk 'function p(){print s1,+S,+E,s5,s6,C,d,q}{k=sprintf("%s,%s,%05d,%05d,%s",$1,$6,$3,$4,$5);a[k]=$4-$3+1}END{t=asorti(a,b);for(n=1;n<=t;n++){split(b[n],c,",");N=c[1]","c[2];if(N!=K){if(K!="")p();s1=c[1];S=c[3];s5=c[5];s6=c[2];C=1;d=a[b[n]];q=c[3]-S;K=N;continue};C++;E=c[4];d=d","a[b[n]];q=q","c[3]-S;K=N}p()}' FILE
ch1 1 35 + m 6 4,6,7,4,4,7 0,4,10,17,21,28
ch2 91 165 - n 6 6,8,15,8,15,11 0,9,17,32,40,64

   

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
2 [报告]
发表于 2014-11-01 21:31 |只看该作者
  1. awk  '{a[$1" "$6]++;b[$1" "$6]=b[$1" "$6]" "$3;c[$1" "$6]=c[$1" "$6]" "$4}END{for(x in a){split(b[x],d," ");split(c[x],e," ");t=asort(d);s=asort(e);printf x" "d[1]" "e[s]" "a[x]" ";for(i=1;i<=t;i++){printf (e[i]-d[i]+1)","};printf " ";for(j=1;j<=t;j++){printf (d[j]-1)","}print ""}}' 1.txt
  2. ch1 m 1 35 6 4,6,7,4,4,7, 0,4,10,17,21,28,
  3. ch2 n 91 165 6 6,8,15,8,15,11, 90,99,107,122,130,154,
复制代码
大概做了下 懒的想了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP