免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请问如何用perl 提取第一列出现指定次数的关键字 [复制链接]

论坛徽章:
0
发表于 2019-11-18 17:57 |显示全部楼层
非常抱歉,来这边提问了perl的问题,主要在那边没有人回答,谢谢大神们了。
我有这样的一个文件:
Query_id        Query_length        Query_start        Query_end        Subject_id        Subject_length        Subject_start        Subject_end        Identity(%)        Align_length        Mismatch        Gap        Score        E_value        Subject_annotation
VVC24062        372        6        372        XP_001951491.1        401        4        370        95.6        367        16        0        700.3        2.2e-199        XP_001951491.1 PREDICTED: eukaryotic initiation factor 4A-III [Acyrthosiphon pisum]
VVC24062        372        6        372        XP_022164948.1        401        4        370        95.4        367        17        0        699.1        4.9e-199        XP_022164948.1 eukaryotic initiation factor 4A-III [Myzus persicae]
VVC24062        372        6        372        XP_015781253.1        405        8        374        87.2        367        47        0        660.6        1.9e-187        XP_015781253.1 eukaryotic initiation factor 4A-III [Tetranychus urticae]
VVC24062        372        13        372        XP_018917276.1        398        8        367        88.9        360        40        0        659.4        4.3e-187        XP_018917276.1 PREDICTED: eukaryotic initiation factor 4A-III [Bemisia tabaci]
VVC24062        372        13        372        XP_013776925.1        403        13        372        88.9        360        40        0        658.7        7.3e-187        XP_013776925.1 eukaryotic initiation factor 4A-III [Limulus polyphemus]
VVC24062        372        13        372        XP_021917996.1        403        13        372        88.3        360        42        0        657.9        1.2e-186        XP_021917996.1 eukaryotic initiation factor 4A-III [Zootermopsis nevadensis]
VVC24063        355        6        355        XP_001951491.1        401        4        353        95.4        350        16        0        666.0        4.3e-189        XP_001951491.1 PREDICTED: eukaryotic initiation factor 4A-III [Acyrthosiphon pisum]
VVC24063        355        6        355        XP_022164948.1        401        4        353        95.1        350        17        0        664.8        9.7e-189        XP_022164948.1 eukaryotic initiation factor 4A-III [Myzus persicae]
VVC24063        355        6        355        XP_015781253.1        405        8        357        86.6        350        47        0        626.3        3.8e-177        XP_015781253.1 eukaryotic initiation factor 4A-III [Tetranychus urticae]
VVC24063        355        13        355        XP_018917276.1        398        8        350        88.3        343        40        0        625.5        6.5e-177        XP_018917276.1 PREDICTED: eukaryotic initiation factor 4A-III [Bemisia tabaci]
VVC24063        355        1        355        XP_023328235.1        374        1        355        85.9        355        50        0        625.5        6.5e-177        XP_023328235.1 eukaryotic initiation factor 4A-III [Eurytemora affinis]
VVC24063        355        13        355        XP_013776925.1        403        13        355        88.3        343        40        0        624.8        1.1e-176        XP_013776925.1 eukaryotic initiation factor 4A-III [Limulus polyphemus]
VVC24064        196        1        184        XP_008178315.1        1308        1        200        48.3        205        80        26        165.2        1.3e-38        XP_008178315.1 PREDICTED: uncharacterized protein K02A2.6-like [Acyrthosiphon pisum]
VVC24064        196        1        189        XP_008188102.1        1220        1        208        46.2        210        90        23        158.7        1.2e-36        XP_008188102.1 PREDICTED: uncharacterized protein K02A2.6-like [Acyrthosiphon pisum]
VVC24064        196        3        196        XP_008182441.1        1334        24        217        46.2        197        100        6        146.0        8.3e-33        XP_008182441.1 PREDICTED: uncharacterized protein K02A2.6-like [Acyrthosiphon pisum]
VVC24064        196        3        196        XP_022162181.1        612        24        217        45.2        197        102        6        143.7        4.1e-32        XP_022162181.1 uncharacterized protein K02A2.6-like [Myzus persicae]
VVC24064        196        2        190        XP_008484647.2        449        23        208        39.7        189        111        3        115.9        9.2e-24        XP_008484647.2 PREDICTED: uncharacterized protein LOC103521316 [Diaphorina citri]
VVC24064        196        3        157        XP_022166224.1        1195        23        176        41.9        155        89        1        111.3        2.3e-22        XP_022166224.1 uncharacterized protein K02A2.6-like, partial [Myzus persicae]
VVC24064        196        2        156        XP_017304412.1        359        11        165        38.1        155        96        0        108.2        1.9e-21        XP_017304412.1 PREDICTED: uncharacterized protein LOC103521973 [Diaphorina citri]

对于第一列的信息,我想根据每行最后的[] 里面的关键词来计算出现次数,譬如


VVC24064它对应出现次数为3,因为后面中括号里的名字一样只能算VVC24064出现一次。
VVC24064        [Acyrthosiphon pisum]
VVC24064        [Myzus persicae]
VVC24064        [Diaphorina citri]

我想把第一列的每个出现的词按照这样统计出来行数,最后只输出出现次数小于等于5的id,请问如何实现,谢谢了!

file.rar

990 Bytes, 下载次数: 13

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
发表于 2019-12-27 09:22 |显示全部楼层
回复 1# chenjiali1

awk勉强来一发,perl不会写
  1. awk -F '\\[| +' 'NR>1{ a[ $(NF-1)" "$NF" " $2]++}END{for(i in a) {split(i,b,"] ");c[b[2]]++};for(i in c) if(c[i]<=5) print i}' file
复制代码

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
发表于 2019-12-27 09:22 |显示全部楼层
回复 1# chenjiali1

awk勉强来一发,perl不会写
awk -F '\\[| +' 'NR>1{ a[ $(NF-1)" "$NF" " $2]++}END{for(i in a) {split(i,b,"] ";c[b[2]]++};for(i in c) if(c<=5) print i}' file

论坛徽章:
9
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:41程序设计版块每日发帖之星
日期:2016-07-04 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-08-09 06:20:0015-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:4715-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:56
发表于 2020-01-28 15:54 |显示全部楼层
root@lp:~/jw/python/data# cat query.txt |awk '{print $1,$(NF-1),$NF}'|sort|uniq -c|awk '{print $2}'|uniq -c
      1 Query_id
      6 VVC24062
      6 VVC24063
      3 VVC24064

论坛徽章:
9
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:41程序设计版块每日发帖之星
日期:2016-07-04 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-08-09 06:20:0015-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:4715-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:56
发表于 2020-01-28 16:44 |显示全部楼层
我觉得这个数据用pandas处理比较合适,但是我这刚学,给你个刚写的吧。
root@lp:~/jw/python/data# cat query_count.py
# query.txt


import pandas as pd
import re

def get_info(x):
    return re.findall('\[.*\]',x)[0]

name = 'query.txt'
a = pd.read_csv(name,sep='\s\s+',engine='python')
b = pd.DataFrame()
b['id'] = a.Query_id
b['name'] = a.Subject_annotation.apply(get_info)
b['iname'] = b.id + b.name
c = b.iname.unique()
d = pd.Series(c)
e = d.apply(lambda x.split('[')[0]).value_counts()
print(e[e<=5])
root@lp:~/jw/python/data# python query_count.py
VVC24064    3
dtype: int64


2020-01-28 16-41-59 的屏幕截图.png

论坛徽章:
0
发表于 2020-02-26 08:49 |显示全部楼层
本帖最后由 Looiml 于 2020-02-26 08:50 编辑
  1. awk -F'[\t[]' 'NR>1{if(!t[$1$NF])a[$1]++;t[$1$NF]++}END{for(i in a)if(a[i]<=5)print i,a[i]}' file.txt
复制代码

用awk实现可以更简洁些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP