为了账号安全,请及时绑定邮箱和手机立即绑定

如果最后一列 !=0 使用 python 或 bash 或 awk,如何从文件中提取行?

如果最后一列 !=0 使用 python 或 bash 或 awk,如何从文件中提取行?

qq_花开花谢_0 2021-09-02 17:21:25
我有一个像这样的大文本文件:#RefName    Pos Coveragelcl|LGDX01000053.1_cds_KOV95322.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   0   0lcl|LGDX01000053.1_cds_KOV95322.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   1   0lcl|LGDX01000053.1_cds_KOV95322.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   2   1lcl|LGDX01000053.1_cds_KOV95323.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   3   0lcl|LGDX01000053.1_cds_KOV95323.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   4   0lcl|LGDX01000053.1_cds_KOV95324.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   5   0lcl|LGDX01000053.1_cds_KOV95324.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   6   101lcl|LGDX01000053.1_cds_KOV95325.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   7   10lcl|LGDX01000053.1_cds_KOV95325.1_1 [locus_tag=ADL02_09560] [protein=MerR family transcriptional regulator] [protein_id=KOV95322.1] [location=complement(1866..2243)] [gbkey=CDS]   8   0第一行是标题,可以忽略或删除。我有两个不同的目标:1) 我想提取最后一列中值不是 0 的所有行。 2) 我想按第一列分组,并在分组文件中:删除第二列,并对最后一列求和。我知道如何在 Pandas 中执行这些操作,但是文件大于 10G,加载到 Pandas 本身很痛苦。有没有干净的方法来做这些?喜欢使用 bash 或 awk 什么的?谢谢!
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

$ awk 'NR>1 && $NF {a[$1]+=$NF} 

       END         {for(k in a) print k, a[k]}' file


lcl|LGDX01000053.1_cds_KOV95325.1_1 10

lcl|LGDX01000053.1_cds_KOV95324.1_1 101

lcl|LGDX01000053.1_cds_KOV95322.1_1 1

由于不匹配其他列无法确保它们都相同,因此以这种方式汇总数据将仅具有键和聚合数据。

解释

awk为这个脚本查找基础语法

NR>1 && $NF 跳过标题 (NR==1) 和零最后字段

{a[$1]+=$NF} 按第一个字段总结最后一个字段作为键

END 最后

{for(k in a) print k, a[k]} 打印所有键值对


查看完整回答
反对 回复 2021-09-02
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

vanilla python 中的一个简单方法就是读取文件,并根据硬编码格式逐行处理它:


sum_groups = 0

with open('groups_file.txt', 'w') as groups_file:

    for line in open('large_text_file.txt', 'r'):

        line_items = line.split(' ')  # split into a list

        if int(line_items[-1]) == 0:  # ignore the line if last value is 0

            continue

        sum_groups += int(line_items[-2])  # add second-to-last column to sum

        line_to_write = ' '.join(line_items[0:1] + line_items[2:]) + '\n'

        groups_file.write(line_to_write)   # write to file, after removing second column      

Python 的文件处理不会一次读取整个文件(我们一次只读取一行,当我们读取下一行时,前一行会被垃圾收集),所以这不应该占用太多除非组本身太大。与写入文件类似,IIRC - 如果您需要,您可以简单地打开一个输出文件并直接从输入文件写入输出文件,而不是将结果附加到groups,从而节省更多内存。


当然,这比批处理整个文件要慢,但速度换空间一直是计算中的主要权衡。


查看完整回答
反对 回复 2021-09-02
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信