免费注册 查看新帖 |

Chinaunix

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

[文本处理] 大牛们帮助我!两个文件的处理 [复制链接]

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-10-08 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-31 03:51 |只看该作者 |倒序浏览
本帖最后由 56836430 于 2013-05-31 04:10 编辑

我有两个文件
file1:
Scaffold_10015  Gmira_TNET11_REPET_TEs  match_part      1997    2603    0.0   
Scaffold_10015  Gmira_TNET11_REPET_TEs  match              20118   22709   0.0     
Scaffold_10016  Gmira_TNET11_REPET_TEs  match              20118   21850   0.0     
file2:
Scaffold10015    1800        -       0       0       CHH     CTT
Scaffold10015    1999        -       0       0       CHH     CTA
Scaffold10015    2400        -       0       0       CHH     CAA
Scaffold10015    3000        -       0       0       CHH     CAC
Scaffold10016    20013      +       0       0       CHH     CAT
Scaffold10016    21760       -       0       6       CHH     CAT
Scaffold10017    47000       -       0       6       CHH     CTA
想得到以下结果,
Result
Scaffold10015    1800        -       0       0       CHH     CTT     other
Scaffold10015    1999        -       0       0       CHH     CTA     match_part
Scaffold10015    2400        -       0       0       CHH     CAA     match_part
Scaffold10015    3000        -       0       0       CHH     CAC     other
Scaffold10016    20013      +       0       0       CHH     CAT    other
Scaffold10016    21760       -       0       6       CHH     CAT    match
Scaffold10017    47000       -       0       6       CHH     CTA    other


其实就是file2中的第二列如果在file1的第四列和第五列之间,则在后面标注上match or match_part,如果不在范围内则标注为other。

我根据以前一位大牛帮忙写的另外一个awk程序进行了小小的修改,但是怎么也得到不正确的答案。。。

这是我修改的小程序,大家帮忙看看哪里出了问题:

awk 'NR==FNR{if (/(exon|intron)/) {sca[$1]++;str=$1 FS sca[$1];a[str]=$3;b[str]=$4;c[str]=$5;d[str]=$(NF-2)};next}
{t=0;if ($1 in sca) {for (i=1;i<=sca[$1];i++) if ($2>=b[$1 FS i]&&$2<=c[$1 FS i]) {print $0,d[$1 FS i],a[$1 FS i];t=1} }
else {print "Scaffold",$1,"is not existed"}
{if (!t) {print $0,"other","other"}}
}' file1 file2

论坛徽章:
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
2 [报告]
发表于 2013-05-31 09:38 |只看该作者
本帖最后由 yestreenstars 于 2013-05-31 12:11 编辑
  1. [root@localhost ~]# cat a
  2. Scaffold_10015  Gmira_TNET11_REPET_TEs  match_part      1997    2603    0.0
  3. Scaffold_10015  Gmira_TNET11_REPET_TEs  match              20118   22709   0.0  
  4. Scaffold_10016  Gmira_TNET11_REPET_TEs  match              20118   21850   0.0
  5. [root@localhost ~]# cat b
  6. Scaffold10015    1800        -       0       0       CHH     CTT
  7. Scaffold10015    1999        -       0       0       CHH     CTA
  8. Scaffold10015    2400        -       0       0       CHH     CAA
  9. Scaffold10015    3000        -       0       0       CHH     CAC
  10. Scaffold10016    20013       +       0       0       CHH     CAT
  11. Scaffold10016    21760       -       0       6       CHH     CAT
  12. Scaffold10017    47000       -       0       6       CHH     CTA
  13. [root@localhost ~]# awk 'NR==FNR{sub(/_/,"",$1);a[$1]=a[$1]!=""?a[$1]" "$4" "$5:$4" "$5;b[$1]=b[$1]!=""?b[$1]" "$3:$3;next}{for(i=1;i<=split(a[$1],c);i+=2){if($2>=c[i]&&$2<=c[i+1]){split(b[$1],d);print $0"\t"d[(i+1)/2];next}}print $0"\tother"}' a b
  14. Scaffold10015    1800        -       0       0       CHH     CTT        other
  15. Scaffold10015    1999        -       0       0       CHH     CTA        match_part
  16. Scaffold10015    2400        -       0       0       CHH     CAA        match_part
  17. Scaffold10015    3000        -       0       0       CHH     CAC        other
  18. Scaffold10016    20013       +       0       0       CHH     CAT        other
  19. Scaffold10016    21760       -       0       6       CHH     CAT        match
  20. Scaffold10017    47000       -       0       6       CHH     CTA        other
  21. [root@localhost ~]#
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-05-31 09:42 |只看该作者
买噶。。只看懂了一半。。。。。

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
4 [报告]
发表于 2013-05-31 10:51 |只看该作者
  1. awk 'NR==FNR{a[NR]=$4;b[NR]=$5;next}{split($0,c);k=0;for(i=1;i<=NR;i++){if(c[2]>=a[i] && c[2]<=b[i]){print $0"\t match_part";k+=1}else if(k==0 && i==3){print $0"\t other"}}}' file1 file2
复制代码

论坛徽章:
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 [报告]
发表于 2013-05-31 11:00 |只看该作者
@代号:军刀
他结果中的最后一个字段match和match_part并不是随便一个都行的,是根据第一个文件生成的,而且你连20013这个也匹配了,所以你的脚本肯定有问题。

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
6 [报告]
发表于 2013-05-31 11:16 |只看该作者
回复 5# yestreenstars


    刚刚没去注意他的match和match_part,修改了一下,应该好了
  1. awk 'NR==FNR{a[NR]=$3" "$4;b[NR]=$5;next}{split($0,c);k=0;for(i=1;i<=NR;i++){split(a[i],d);if(c[2]>=d[2] && c[2]<=b[i]){print $0"\t"d[1];k+=1;break}else if(k==0 && i==3){print $0"\t other"}}}' file1 file2
  2. Scaffold10015    1800        -       0       0       CHH     CTT         other
  3. Scaffold10015    1999        -       0       0       CHH     CTA        match_part
  4. Scaffold10015    2400        -       0       0       CHH     CAA        match_part
  5. Scaffold10015    3000        -       0       0       CHH     CAC         other
  6. Scaffold10016    20013      +       0       0       CHH     CAT  other
  7. Scaffold10016    21760       -       0       6       CHH     CAT        match
  8. Scaffold10017    47000       -       0       6       CHH     CTA         other
复制代码

论坛徽章:
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
7 [报告]
发表于 2013-05-31 12:13 |只看该作者
回复 6# 代号:军刀


    还是有问题,我把file1的内容稍微改动了一下,你拿去测试,比较一下我和你的脚本就知道了:
Scaffold_10015  Gmira_TNET11_REPET_TEs  match_part      1997    2603    0.0   
Scaffold_10015  Gmira_TNET11_REPET_TEs  match_part        20118   22709   0.0     
Scaffold_10016  Gmira_TNET11_REPET_TEs  match              20118   21850   0.0

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
8 [报告]
发表于 2013-05-31 13:07 |只看该作者
本帖最后由 代号:军刀 于 2013-05-31 13:25 编辑

回复 7# yestreenstars


    哎,又漏了第一个字段, 从这题来看,你比我仔细很多

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
9 [报告]
发表于 2013-05-31 13:42 |只看该作者
本帖最后由 代号:军刀 于 2013-05-31 13:42 编辑

回复 7# yestreenstars


    你用你的代码测试一下下面这内容
Scaffold_10015  Gmira_TNET11_REPET_TEs  match_part      1997    2603    0.0   
Scaffold_10015  Gmira_TNET11_REPET_TEs  match              1996   2996   0.0     
Scaffold_10016  Gmira_TNET11_REPET_TEs  match              20118   21850   0.0

论坛徽章:
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
10 [报告]
发表于 2013-05-31 14:08 |只看该作者
回复 9# 代号:军刀


    我想你有一个问题没搞清,如果$1相同的话,后面的范围应该是不会重叠的~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP