如何从文件中提取最后一列中的行=0是否使用python、bash或awk?

如何从文件中提取最后一列中的行=0是否使用python、bash或awk?,python,bash,awk,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_K

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

#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之类的


谢谢大家!

普通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-如果需要,您只需打开一个输出文件,直接从填充文件写入输出文件,而无需将结果附加到
,从而节省更多内存

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

$ 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
syntax

NR>1&&$NF
skip header(NR==1)和零个最后字段

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

结束
最后

{对于(a中的k)打印k,a[k]}
打印所有键值对


根据您的分隔符(空格?)拉记录=0很容易-删除c2很容易。你说的“第一栏分组”是什么意思?我们是否忽略所有其他列,但将它们保留在输出中?它们总是一样的吗?我会用awk。这不是一个合适的问题。请研究不同的方法来完成任务,尝试一个解决方案,并在这里张贴,如果你遇到麻烦。我尝试了这个,它似乎工作得很好。你介意解释一下你的剧本吗?非常感谢。非常感谢你的解释!