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

我有一个像这样的大文本文件:


#RefName    Pos Coverage

lcl|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   0

lcl|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   0

lcl|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   1

lcl|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   0

lcl|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   0

lcl|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   0

lcl|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   101

lcl|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   10

lcl|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 什么的?


谢谢!


qq_花开花谢_0
浏览 128回答 2
2回答

一只名叫tom的猫

$ awk 'NR>1 && $NF {a[$1]+=$NF}        END         {for(k in a) print k, a[k]}' filelcl|LGDX01000053.1_cds_KOV95325.1_1 10lcl|LGDX01000053.1_cds_KOV95324.1_1 101lcl|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]} 打印所有键值对

慕尼黑5688855

vanilla python 中的一个简单方法就是读取文件,并根据硬编码格式逐行处理它:sum_groups = 0with 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,从而节省更多内存。当然,这比批处理整个文件要慢,但速度换空间一直是计算中的主要权衡。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python