免费注册 查看新帖 |

Chinaunix

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

[文本处理] 如何处理有重复或者有重叠的数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2019-02-19 10:38 |只看该作者 |倒序浏览
A文件有4列:序列ID,起始位置,终止位置,和分值
scaffold02012   139313  139492  289
scaffold02012   221580  221401  250
scaffold00023   29060   28882   298
scaffold00023   24197   24019   292
scaffold00843   136834  137012  292
scaffold00843   132182  132361  272
scaffold04031   67920   68099   278
scaffold04031   63353   63531   254
scaffold03726   18943   18765   276
scaffold03726   25660   25481   267
scaffold02814   1326    1508    255
scaffold03577   1698819 1698981 243
scaffold01028   83997   84139   237
scaffold00714   104062  103928  211
scaffold00714   108620  108504  195
scaffold02012   221580  221402  259
scaffold03726   18943   18766   296
scaffold03726   25660   25482   265
scaffold00023   24197   24023   296
scaffold00023   29060   28892   285
scaffold00843   136834  137003  287
scaffold00843   132182  132351  259
scaffold04031   67920   68089   265
scaffold04031   63353   63530   252
scaffold03577   1698819 1698981 243
scaffold02814   1329    1498    237
scaffold01028   83997   84139   237
scaffold00714   104062  103928  211
scaffold00714   108620  108504  200
scaffold02541   135716  135821  147


我想请教的是如何将前三列有重复的保留分值高的行;如果位置有重叠的选择分值高的行。分值相同时,保留长度长的行。得到B文件
scaffold02012   139313  139492  289
scaffold00023   29060   28882   298
scaffold00843   136834  137012  292
scaffold00843   132182  132361  272
scaffold04031   67920   68099   278
scaffold04031   63353   63531   254
scaffold03726   18943   18765   276
scaffold03726   25660   25481   267
scaffold02814   1326    1508    255
scaffold03577   1698819 1698981 243
scaffold01028   83997   84139   237
scaffold00714   104062  103928  211
scaffold02012   221580  221402  259
scaffold03726   18943   18766   296
scaffold03726   25660   25482   265
scaffold00023   24197   24023   296
scaffold00023   29060   28892   285
scaffold00714   108620  108504  200
scaffold02541   135716  135821  147



论坛徽章:
0
2 [报告]
发表于 2019-02-19 14:52 |只看该作者
不好意思,没说清楚。
A文件4列:序列ID,起始位置,终止位置和分值。我先用了sort -k1,1 -k2,2n进行了排序。
scaffold04031   63010   63526   708
scaffold04031   63189   63527   488
scaffold04031   63189   63543   510
scaffold04031   63353   63530   252
scaffold04031   63353   63531   254
scaffold04031   67587   68099   701
scaffold04031   67758   68098   514
scaffold04031   67758   68114   529
scaffold00714   104062  103928  211
scaffold00714   104062  103928  211
scaffold00714   104226  103928  431
scaffold00714   104226  103928  446
scaffold00714   104409  103928  621
scaffold00714   104409  103928  686

scaffold02012   133918  134432  776
scaffold02012   133918  134438  767
scaffold02012   133920  134185  350
scaffold02012   133938  134185  335



我想请教的是在序列ID相同时,起始位置(第二列)和终止位置(第三列)有重叠的,取分值高的行。且前三列有重复的,去分值高的。得到B文件
scaffold04031   63010   63526   708
scaffold04031   67587   68099   701
scaffold00714   104409  103928  686
scaffold02012   133918  134432  776

祝各位大神元宵节快乐!


论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
3 [报告]
发表于 2019-02-19 16:56 |只看该作者
回复 2# 小小脑

# 第一行赋值,
awk 'NR==1{key=$1;begin=$2;end=$3;temp=$0;max=$4}NR>1{

# 如果下一行key相等,

if(key==$1 ) {

       # 那么,比较$3,如果$3相等,获得最大值,备用,保留该行,直接next,跳过剩余的if比较。

        if ( $3 == end ) { max=$4;temp=$0;next}

        # 如果覆盖,比较$4, 取得最大值max和该行。

        if ( ($3>= begin && $3<=end) || ($2>=begin && $2<=end) || ($2>=begin && $3 <=end) ){


                if(max<$4) {max=$4;temp=$0 }

        # 如果key相等,但又不覆盖,打印,reset值。

        } else {print temp;key=$1;begin=$2;end=$3;temp=$0;max=$4}
        }

# 如果key不相等,把上一个符合的打印出来。

else {print temp;key=$1;begin=$2;end=$3;temp=$0;max=$4}
# 如果一直满足,key一直相等,是走不到else部分的,只能在END部分打印出来。
}END{print temp}' a

---------------------

awk 'NR==1{key=$1;begin=$2;end=$3;temp=$0;max=$4}NR>1{



if(key==$1 ) {

if ( $3 == end ) { max=$4;temp=$0;next}

        if ( ($3>= begin && $3<=end) || ($2>=begin && $2<=end) || ($2>=begin && $3 <=end) ){


                if(max<$4) {max=$4;temp=$0 }

        } else {print temp;key=$1;begin=$2;end=$3;temp=$0;max=$4}
        }

else {print temp;key=$1;begin=$2;end=$3;temp=$0;max=$4}



}END{print temp}' a
scaffold04031   63010   63526   708
scaffold04031   67587   68099   701
scaffold00714   104409  103928  686

scaffold02012   133918  134432  776


,
总结,708是在key相等的 else处打印,701,686在key不相等的else打印,776在END处打印。


论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
4 [报告]
发表于 2019-02-19 17:06 |只看该作者
哦,看错了,前三列重复的判断,没看明白规则,你自己改一下就可以了。

就是next那部分。

论坛徽章:
0
5 [报告]
发表于 2019-02-20 10:15 |只看该作者
回复 3# expert1

感谢大神,我试了下多的数据发现会有起始位置(第二列)和终止位置(第三列)有重叠的行(B文件红色的行)。A文件为数据
Chr1    2157109 2157660 808
Chr1    3360660 3360540 219
Chr1    3780765 3781512 1360
Chr1    3785281 3785720 797
Chr1    4411120 4410950 233
Chr1    5691756 5691938 300
Chr1    6302607 6303156 776
Chr1    6538418 6538589 244
Chr1    6543373 6543536 230
Chr1    6704196 6704365 231
Chr1    6709162 6709324 230
Chr1    7714707 7715145 767
Chr1    7717356 7718103 1282
Chr1    7722108 7722547 769
Chr1    10696714        10696898        320
Chr1    10916029        10916151        159
Chr1    11793805        11794079        508
Chr1    12570840        12570622        300
Chr1    12664679        12664517        263
Chr1    12673968        12673153        1219
Chr1    12680165        12679988        246
Chr1    12845527        12845721        268
Chr1    13182085        13181862        326
Chr1    13186958        13187277        562
Chr1    13212054        13211963        154
Chr1    13213084        13212867        322
Chr1    13508921        13507780        1485
Chr1    13515963        13514806        1594
Chr1    13515964        13515480        647
Chr1    13644710        13644552        230
Chr1    13654366        13654168        279
Chr1    13659274        13660438        1899
Chr1    13659855        13660404        939
Chr1    13666402        13667557        1853
Chr1    13666985        13667534        931
Chr1    13711662        13712500        1282
Chr1    13748442        13748252        265
Chr1    13768755        13768440        424
Chr1    13781513        13781647        182
Chr1    13785915        13786614        1131
Chr1    13786687        13787958        2104
Chr1    13786935        13788274        2021
Chr1    13793494        13794661        1947
Chr1    13793640        13794672        1622
Chr1    13798261        13796499        2381
Chr1    13818567        13818942        641
Chr1    13823513        13823888        641
Chr1    13864719        13862959        2904
Chr1    13864721        13864485        377
Chr1    13883074        13884241        1903



B文件为结果

Chr1    2157109 2157660 808
Chr1    3360660 3360540 219
Chr1    3780765 3781512 1360
Chr1    3785281 3785720 797
Chr1    4411120 4410950 233
Chr1    5691756 5691938 300
Chr1    6302607 6303156 776
Chr1    6538418 6538589 244
Chr1    6543373 6543536 230
Chr1    6704196 6704365 231
Chr1    6709162 6709324 230
Chr1    7714707 7715145 767
Chr1    7717356 7718103 1282
Chr1    7722108 7722547 769
Chr1    10696714        10696898        320
Chr1    10916029        10916151        159
Chr1    11793805        11794079        508
Chr1    12570840        12570622        300
Chr1    12664679        12664517        263
Chr1    12673968        12673153        1219
Chr1    12680165        12679988        246
Chr1    12845527        12845721        268
Chr1    13182085        13181862        326
Chr1    13186958        13187277        562
Chr1    13212054        13211963        154
Chr1    13213084        13212867        322
Chr1    13508921        13507780        1485
Chr1    13515963        13514806        1594
Chr1    13515964        13515480        647
Chr1    13644710        13644552        230
Chr1    13654366        13654168        279
Chr1    13659274        13660438        1899
Chr1    13666402        13667557        1853
Chr1    13711662        13712500        1282
Chr1    13748442        13748252        265
Chr1    13768755        13768440        424
Chr1    13781513        13781647        182
Chr1    13785915        13786614        1131
Chr1    13786687        13787958        2104
Chr1    13793494        13794661        1947
Chr1    13798261        13796499        2381
Chr1    13818567        13818942        641
Chr1    13823513        13823888        641
Chr1    13864719        13862959        2904
Chr1    13864721        13864485        377
Chr1    13883074        13884241        1903



麻烦大神了!

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
6 [报告]
发表于 2019-02-20 12:44 |只看该作者
回复 5# 小小脑

你这个是$2 > $3的情况,没有处理,如果是这样的情况,比如
a 20 10 99
a 21  15 98
你要的结果是哪个,为什么?

告诉我我改一下就好了。

论坛徽章:
0
7 [报告]
发表于 2019-02-20 12:59 |只看该作者
回复 6# expert1

同样取分值高的行。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
8 [报告]
发表于 2019-02-20 14:26 |只看该作者
回复 7# 小小脑

awk 'NR==1{key=$1;begin=$2;end=$3;temp=$0;max=$4}NR>1{



if(key==$1 ) {

        if ( $3 == end ) { max=$4;temp=$0;next}

        if ( ($3>= begin && $3<=end) || ($2>=begin && $2<=end) || ($2>=begin && $3 <=end) || ($3>=begin && $2 <=end) ){


                if(max<$4) {max=$4;temp=$0 }

        } else {

                print temp;key=$1;temp=$0;max=$4

                if ($2>$3){begin=$3;end=$2 } else {begin=$2;end=$3}


                }
}else {


                print temp;key=$1;temp=$0;max=$4;


                if ($2>$3) {   begin=$3;end=$2        } else { begin=$2;end=$3 }



        }

}END{print temp}' file


如果$2>$3, 比较的时候,反过来,最后赋值也是反过来。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
9 [报告]
发表于 2019-02-20 14:26 |只看该作者
发重复了,编辑掉。

论坛徽章:
0
10 [报告]
发表于 2019-02-20 15:51 |只看该作者
回复 8# expert1

我不能理解的是,这样的数据没问题。再换个数据。输入代码之后还是会出现$2>$3的情况。我就重复输入代码,输入一次输出的行数目减少一些,直到不再减少
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP