免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3803 | 回复: 7

[文本处理] 去除重复位置的序列 [复制链接]

论坛徽章:
0
发表于 2019-12-07 12:22 |显示全部楼层
A文件有三列数据:序列id,起始位置,终止位置chr1  200      400
chr1  430      1000
chr2  150      300
chr3  20        100
chr4  60        250
chr5  40        250
B文件同样三列数据:序列id,起始位置,终止位置
chr1  100      300
chr1  450      600
chr2  180      300
chr3  60        110
chr4  40        200

chr4  80        200
chr5  25        90



问题:将B文件中完全被包含在A文件中的序列删除,得到如下结果
chr1  100      300
chr3  60        110
chr4  40        200

chr5  25        90


论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2019-12-07 16:40 |显示全部楼层

  1. awk 'NR==FNR{s[$1]=$2;e[$1]=$3}
  2. NR>FNR&&(NF==0||$2<s[$1]||$3>e[$1])' urfileA urfileB
复制代码

评分

参与人数 1可用积分 +10 收起 理由
飘絮絮絮丶 + 10 赞一个!

查看全部评分

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
发表于 2020-01-27 21:56 |显示全部楼层
回复 2# waker

A文件的如果包含重复的数据就不太行,
比如他和问题在同一行的那个数据和后边的chr1调换位置,
不是唯一的键值对应,所以不能直接这么写,不知道我说清楚没

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
发表于 2020-02-16 14:43 |显示全部楼层
回复 3# ll104567


能否举例说明?

论坛徽章:
0
发表于 2020-02-18 09:51 |显示全部楼层
本帖最后由 nulcearbear 于 2020-02-18 10:03 编辑
  1. #!/bin/bash
  2. IFS=$"\n"
  3. if [ $# -ne 2 ];then
  4.     echo "sh $0 file_baseline file_to_filter"
  5.     exit
  6. fi
  7. file_a=$1
  8. file_b=$2

  9. for tmp in `cat $file_b`
  10. do
  11.     index_b=`echo $tmp |awk '{print $1}'`
  12.     start_b=`echo $tmp |awk '{print $2}'`
  13.     stop_b=`echo $tmp |awk '{print $3}'`
  14.     flag=0
  15.     result=`grep $index_b $file_a`
  16.     for line in $result
  17.     do
  18.         index_a=`echo $line |awk '{print $1}'`
  19.         start_a=`echo $line |awk '{print $2}'`
  20.         stop_a=`echo $line  |awk '{print $3}'`
  21.         if [ $start_a -le $start_b ] && [ $stop_a -ge $stop_b ]
  22.         then
  23.             flag=$(($flag+1))
  24.         fi
  25.         #echo $index_a $start_a $stop_a $flag $index_b $start_b $stop_b
  26.     done
  27.     if [ $flag -eq 0 ]
  28.     then
  29.         echo $index_b $start_b $stop_b
  30.     fi
  31. done
复制代码

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2020-02-21 23:18 |显示全部楼层
本帖最后由 wh7211 于 2020-02-21 23:19 编辑

回复 1# wd_my

  1. cat 1
  2. chr1  200      400
  3. chr1  430      1000
  4. chr2  150      300
  5. chr3  20        100
  6. chr4  60        250
  7. chr5  40        250

  8. cat 2
  9. chr1  100      300
  10. chr1  450      600
  11. chr2  180      300
  12. chr3  60        110
  13. chr4  40        200

  14. chr4  80        200
  15. chr5  25        90

  16. awk 'FILENAME==ARGV[1]{a[$1]=$2;b[$1]=$3;next}/^$/||$2<a[$1]||$3>b[$1]' 1 2
  17. chr1  100      300
  18. chr3  60        110
  19. chr4  40        200

  20. chr5  25        90
复制代码

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
发表于 2020-02-25 13:00 |显示全部楼层
回复 4# Shell_HAT
我的意思是这样的,如果多出来一个有重叠的数据的情况,第一行的90-350 和后边的200-400有重叠部分,会有一点问题
  1. root@lp:~/lp/python/data# cat a.txt
  2. <font color="Red">chr1  90       350</font>
  3. chr1  200      400
  4. chr1  430      1000
  5. chr2  150      300
  6. chr3  20        100
  7. chr4  60        250
  8. chr5  40        250
  9. root@lp:~/lp/python/data# cat b.txt
  10. chr1  100      300
  11. chr1  450      600
  12. chr2  180      300
  13. chr3  60        110
  14. chr4  40        200
  15. chr4  80        200
  16. chr5  25        90
  17. root@lp:~/lp/python/data# awk 'NR==FNR{s[$1]=$2;e[$1]=$3}NR>FNR&&(NF==0||$2<s[$1]||$3>e[$1])'  a.txt b.txt
  18. chr1  100      300
  19. chr3  60        110
  20. chr4  40        200
  21. chr5  25        90
复制代码

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
发表于 2020-02-25 13:04 |显示全部楼层
root@lp:~/lp/python/data# cat x.csv
chr1  100 300
chr3 60 110
chr4 40 200
chr5 25 90
root@lp:~/lp/python/data# cat get_data.py

  1. import pandas as pd

  2. a = pd.read_csv('a.txt',header=None,names=['id','start','end'],sep='\s+')
  3. b = pd.read_csv('b.txt',header=None,names=['id','start','end'],sep='\s+')

  4. x = []
  5. for i in range(b.shape[0]):
  6.      bstart = b.iloc[i].start
  7.      bend = b.iloc[i].end
  8.      bid = b.iloc[i].id
  9.      xx = a[a.id==bid]
  10.      flag = False
  11.      for j in range(xx.shape[0]):
  12.          if xx.iloc[j].end >= bend and xx.iloc[j].start <= bstart:
  13.              flag = True
  14.      if flag == True:
  15.          x.append(False)
  16.      else:
  17.          x.append(True)

  18. b[x].to_csv('x.csv',sep=' ',index=None,header=None)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP