免费注册 查看新帖 |

Chinaunix

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

[文本处理] 怎么对多个文本指定列取交集呢? [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-07 13:24 |只看该作者 |倒序浏览
shell大神们好:
如果我有在当前目录下有N个文件夹,每个文件夹下有一个as.list,他们的格式是这样的:
  1. #Name   Chromosome      Start_pos       End_pos Transcript      Strand  Start_HGVS      End_HGVS        Gene    Exon    UTR&&CDS
  2. CH29    chr10   23481751        23481758        NM_178161.2     +       c.292   c.299   PTF1A   EX1     C1
  3. CH29    chr10   23481960        23481962        NM_178161.2     +       c.390   c.503   PTF1A   EX1     C1
  4. CH29    chr10   88854756        88854776        NM_005271.3     -       c.-230  c.-250  GLUD1   EX1     5U1E
  5. CH29    chr11   17498411        17498447        NM_000352.3     -       c.-88   c.-124  ABCC8   EX1     5U1E
复制代码
第一行title都一样,第一列是对应得文件夹名如果我现在想对这些文本的二三四五九十一列取交集,也就是如果每一个第二、第五、第九、第十一列在所有的as.list里面出现次数超过80%的话(在一个as.list有多行的第二、第五、第九列、第十二列是相同的,如果,对三、四列代表的区域取交集,比方说80%的as.list的第二、第五、第九列、第十二都有 chr10  NM_178161.2  PTF1A EX1这行,我们就把对应的三、四列的数字拿出来,假如是:file1:1 100 file2:5  60 file3:4  20 file4:200  250得到的结果就是:
chr10  NM_178161.2  PTF1A  C1 EX1 5  20
但是一定要注意就是一个as.list可能有多行的第二、第五、第九列、第十一列是相同的,可以肯定的是他们的三、四列的数字一定不会有交集
比如:
file1:
1 100
200 300
file2:
5  60
70 80
file3:
4  20
40 65
file4:
200  250
这个时候我想得到的是:
chr10  NM_178161.2  PTF1A C1 EX1 5  20
chr10  NM_178161.2  PTF1A C1 EX1 40 60
============================
整理一下思路:其实
  1. CH29    chr10   23481751        23481758        NM_178161.2     +       c.292   c.299   PTF1A   EX1     C1
  2. CH29    chr10   23481960        23481962        NM_178161.2     +       c.390   c.503   PTF1A   EX1     C1
复制代码
代表的数据是:
  1. chr10   23481751        23481752        NM_178161.2     PTF1A   EX1   
  2. chr10   23481752        23481753        NM_178161.2     PTF1A   EX1     
  3. chr10   23481754        23481755        NM_178161.2     PTF1A   EX1   
  4. chr10   23481756        23481757        NM_178161.2     PTF1A   EX1     
  5. chr10   23481757        23481758        NM_178161.2     PTF1A   EX1
  6. --
  7. chr10   23481960        23481961       NM_178161.2     PTF1A   EX1  
  8. chr10   23481961        23481962       NM_178161.2     PTF1A   EX1  
复制代码
我就是想把每个文件拆分成它代表的数据,然后得到代表数据中每一行在80%的as.list中有出现的行然后相近的合并回来。。。
不知道有没有好的方法实现。。。我觉得太难了,所以求助一下!
谢谢大神们了!!!

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-03-07 14:52 |只看该作者
没人回帖好伤感。。
80%的一个定义(感谢perl板块的大神):



file1:
1 100
200 300

file2:
5  60
70 80

file3:
4  20
40 65

file4:
200  250


如果图中所示,四个文件,那么就是在int(4*80%)=3个文件里面都存在5-20, 40-60区域,而其他的区域并不满足,所以输出:
chr10  NM_178161.2  PTF1A C1 EX1 5  20
chr10  NM_178161.2  PTF1A C1 EX1 40 60

142924gic013t1gdsugc2g.png (3.69 KB, 下载次数: 89)

142924gic013t1gdsugc2g.png

论坛徽章:
0
3 [报告]
发表于 2014-03-07 16:21 |只看该作者
大神你这个问题不仅难,我看需求就没看懂...

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
4 [报告]
发表于 2014-03-07 16:47 |只看该作者
回复 3# huang_wunix


    sorry。。。表达确实有问题。。。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2014-03-07 17:05 |只看该作者
你的问题要来自星星的你才能回答~

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
6 [报告]
发表于 2014-03-07 17:07 |只看该作者
回复 5# yestreenstars


    大大:那个整理一下思路:其实
  1. CH29    chr10   23481751        23481758        NM_178161.2     +       c.292   c.299   PTF1A   EX1     C1
  2. CH29    chr10   23481960        23481962        NM_178161.2     +       c.390   c.503   PTF1A   EX1     C1
复制代码
代表的数据是:
  1. chr10   23481751        23481752        NM_178161.2     PTF1A   EX1   
  2. chr10   23481752        23481753        NM_178161.2     PTF1A   EX1     
  3. chr10   23481754        23481755        NM_178161.2     PTF1A   EX1   
  4. chr10   23481756        23481757        NM_178161.2     PTF1A   EX1     
  5. chr10   23481757        23481758        NM_178161.2     PTF1A   EX1
  6. --
  7. chr10   23481960        23481961       NM_178161.2     PTF1A   EX1  
  8. chr10   23481961        23481962       NM_178161.2     PTF1A   EX1  
复制代码
我就是想把每个文件拆分成它代表的数据,然后得到代表数据中每一行在80%的as.list中有出现的行然后相近的合并回来。。。也就是把所有的as.list拆分之后假若有一行:
chr10   23481752        23481753        NM_178161.2     PTF1A   EX1   
在80%的as.list拆分文件都存在,就输出。。。

这样。。。可以吗

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2014-03-07 17:11 |只看该作者
回复 5# yestreenstars


你不就是星星么?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
8 [报告]
发表于 2014-03-07 17:15 |只看该作者
回复 7# ly5066113

大神你又调皮了~
   

论坛徽章:
3
水瓶座
日期:2014-02-20 12:02:14天蝎座
日期:2014-03-19 14:04:46水瓶座
日期:2014-07-26 20:01:02
9 [报告]
发表于 2014-03-07 17:19 |只看该作者
不如简单的说一下,原始数据是怎样,你期望得到的目的数据是怎样,中间是怎样的规则。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
10 [报告]
发表于 2014-03-07 17:25 |只看该作者
回复 6# huang6894


如果文件没有多到超过 shell 的命令行参数限制:
  1. a=($(find . -name as.list -type f))
  2. awk -v n=${#a[@]} 'BEGIN{m=int(n*0.8)}{for(i=$3;i<$4;i++)a[$2"\t"i"\t"(i+1)"\t"$5"\t"$9"\t"$11]++}END{for(i in a)if(a[i]>=m)print i}' ${a[@]}
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP