免费注册 查看新帖 |

Chinaunix

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

[文本处理] 两文件中指定列的搜索 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-11 16:15 |只看该作者 |倒序浏览
文件file1:(tab分隔)
chr5   122226        T        2        10        28.90        [0, 0, 0, 10]        -        0.00         1.0
chr5   145237         A      3        10        30.10        [0, 0, 0, 10]        -        0.00         1.0
chr6   14238        A        5       10        29.50        [10, 0, 0, 0]        -        0.00         1.0
chr6   1233419        T        2        10        30.10        [0, 0, 0, 10]        -        0.00         1.0
chr6   1755660        C        6        10        27.40        [0, 0, 10, 0]        -        0.00         1.0
chr6   1115521        T        2        10        28.80        [0, 10, 0, 0]        -        0.00         1.0
chr8   1555522        C        7        10        31.60        [10, 0, 0, 0]        -        0.00         1.0
chrY   2323523        C        9        10        32.10        [0, 0, 0, 10]        -        0.00         1.0

文件file2:(tab分隔)
chr5   125516        A        1        10        29.90        [0, 0, 0, 10]        -        0.00         1.0
chr5   135517        A        2        10        34.10        [0, 10, 0, 10]        -        0.00         1.0
chr7   185518        T        3        10        69.50        [10, 0, 0, 0]        -        0.00         1.0
chr8   195519        C        5        10        70.10        [10, 0, 0, 0]        -        0.00         1.0
chr10   345520        T        12        10        87.40        [0, 0, 10, 0]        -        0.00         1.0

我想要在file1中搜索与file2中第一列,第三列,第七列都相同的行。结果如下:
chr5   145237         A      3        10        30.10        [0, 0, 0, 10]        -        0.00         1.0
chr8   1555522        C        7        10        31.60        [10, 0, 0, 0]        -        0.00         1.0

请大神们帮帮忙??

论坛徽章:
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-10-11 16:52 |只看该作者
本帖最后由 wiliiwin 于 2014-10-11 16:59 编辑
  1. awk  'NR==FNR{a[$1","$3","$7]=$0}NR>FNR{for (x in a){if(x==$1","$3","$7){print a[x]}}}'  aa.txt bb.txt
  2. chr5   145237         A      3        10        30.10        [0,0,0,10]        -        0.00         1.0
  3. chr8   1555522        C        7        10        31.60        [10,0,0,0]        -        0.00         1.0
复制代码
你的[]里面有空格,导致$7不是整个括号的,我想你要匹配的是括号的所有,因此需要提前把[]里面的空格给去掉

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
3 [报告]
发表于 2014-10-11 16:56 |只看该作者
回复 1# gooderpan
  1. awk 'NR==FNR{a[$1","$3","$7]++;next}{if(a[$1","$3","$7])next}1' file1 file2
复制代码

论坛徽章:
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
4 [报告]
发表于 2014-10-11 17:11 |只看该作者
本帖最后由 wiliiwin 于 2014-10-11 17:12 编辑

回复 3# bulletmarquis
你这个测试 不对,输出数据就不是他要的
  1. awk 'NR==FNR{a[$1","$3","$7]++;next}{if(a[$1","$3","$7])next}1'  aa.txt  bb.txt
  2. chr7   185518        T        3        10        69.50        [10, 0, 0, 0]        -        0.00         1.0
  3. chr10   345520        T        12        10        87.40        [0, 0, 10, 0]        -        0.00         1.0
复制代码
  1. awk 'NR==FNR{a[$1","$3","$7]++;next}{if(a[$1","$3","$7])next}1'   bb.txt  aa.txt
  2. chr5   122226        T        2        10        28.90        [0, 0, 0, 10]        -        0.00         1.0
  3. chr6   14238        A        5       10        29.50        [10, 0, 0, 0]        -        0.00         1.0
  4. chr6   1233419        T        2        10        30.10        [0, 0, 0, 10]        -        0.00         1.0
  5. chr6   1755660        C        6        10        27.40        [0, 0, 10, 0]        -        0.00         1.0
  6. chr6   1115521        T        2        10        28.80        [0, 10, 0, 0]        -        0.00         1.0
  7. chrY   2323523        C        9        10        32.10        [0, 0, 0, 10]        -        0.00         1.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
5 [报告]
发表于 2014-10-11 17:33 |只看该作者
@wiliiwin@bulletmarquis
你们似乎都忽略了一个条件,他是以tab分隔的,所以必须指定分隔符。

论坛徽章:
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
6 [报告]
发表于 2014-10-11 17:36 |只看该作者
  1. [root@localhost ~]# cat a
  2. chr5        122226        T        2        10        28.90        [0, 0, 0, 10]        -        0.00        1.0
  3. chr5        145237        A        3        10        30.10        [0, 0, 0, 10]        -        0.00        1.0
  4. chr6        14238        A        5        10        29.50        [10, 0, 0, 0]        -        0.00        1.0
  5. chr6        1233419        T        2        10        30.10        [0, 0, 0, 10]        -        0.00        1.0
  6. chr6        1755660        C        6        10        27.40        [0, 0, 10, 0]        -        0.00        1.0
  7. chr6        1115521        T        2        10        28.80        [0, 10, 0, 0]        -        0.00        1.0
  8. chr8        1555522        C        7        10        31.60        [10, 0, 0, 0]        -        0.00        1.0
  9. chrY        2323523        C        9        10        32.10        [0, 0, 0, 10]        -        0.00        1.0
  10. [root@localhost ~]# cat b
  11. chr5        125516        A        1        10        29.90        [0, 0, 0, 10]        -        0.00        1.0
  12. chr5        135517        A        2        10        34.10        [0, 10, 0, 10]        -        0.00        1.0
  13. chr7        185518        T        3        10        69.50        [10, 0, 0, 0]        -        0.00        1.0
  14. chr8        195519        C        5        10        70.10        [10, 0, 0, 0]        -        0.00        1.0
  15. chr10        345520        T        12        10        87.40        [0, 0, 10, 0]        -        0.00        1.0
  16. [root@localhost ~]# awk -F'\t' 'NR==FNR{a[$1 FS $3 FS $7];next}$1 FS $3 FS $7 in a' b a
  17. chr5        145237        A        3        10        30.10        [0, 0, 0, 10]        -        0.00        1.0
  18. chr8        1555522        C        7        10        31.60        [10, 0, 0, 0]        -        0.00        1.0
  19. [root@localhost ~]#
复制代码

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
7 [报告]
发表于 2014-10-12 01:12 |只看该作者
学生党:无聊~用python模拟awk试试

  1. #!/usr/bin/env python
  2. # -*- coding:gbk -*-

  3. import sys
  4. import fileinput
  5. list={}
  6. for x in fileinput.input(sys.argv[1:]):
  7.         if fileinput.lineno()==fileinput.filelineno():
  8.                 list[(x.split()[0],x.split()[2],''.join(x.split()[6:10]))]=x
  9.         else:
  10.                 if (x.split()[0], x.split()[2],''.join(x.split()[6:10])) in list.keys():
  11.                         print x,
复制代码
测试:
$ ./yhsafe.py file2.txt file1.txt
chr5   145237        A        3        10        30.10        [0, 0, 0, 10]     -        0.00         1.0
chr8   1555522       C        7        10        31.60        [10, 0, 0, 0]     -        0.00         1.0

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
8 [报告]
发表于 2014-10-12 11:43 |只看该作者
星辰大婶,可以帮解释下嘛。没看懂,这是怎么实现的
回复 6# 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
9 [报告]
发表于 2014-10-12 13:16 |只看该作者
回复 8# prcardin

将第1、3、7列组合成一个键,存入数组,然后在遍历第二个文件时,判断当前行组成的键是否在数组中,存在则打印,否则不打印~{:3_193:}
   

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
10 [报告]
发表于 2014-10-13 08:55 |只看该作者
回复 5# yestreenstars


    TAB分隔不需要指定吧?空格、TAB都是默认分隔符
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP