我有一个tsv文件,它的结构是这样的:
AAAAAAAAAAAAAAAAAA 122363
ATGCTGTATAGAATATAT 1
CAGCTCACTTAAACTTAA 1
GTCTGACATCTTACATGA 3
TGCCTTAACTTGTTATTA 1
GTGTTTGATGTCGTTGTC 1
TTAAAAAAATTTTGCCTT 9
GTCCTATAAGGCTTCCCT 1
CGGGTTGGGAAGCACACA 1
TTTTTTAGACGAAAACTA 30
GACTCCTGGTCACGTAAG 12
TGGTTTTTGTTTTGTAAT 58
TGTATAATGGACGTCGCA 1
我想在右列中找到“1”的每个示例,并删除整行,因此最终的数据集如下所示:
AAAAAAAAAAAAAAAAAA 122363
GTCTGACATCTTACATGA 3
TTAAAAAAATTTTGCCTT 9
TTTTTTAGACGAAAACTA 30
GACTCCTGGTCACGTAAG 12
TGGTTTTTGTTTTGTAAT 58
我已经能够进入Excel,过滤两列,只显示右列中“1”的示例,并试图选择所有行,并一次性删除它们。然而,这个文件是~2 GB,所以数据量是相当大的Excel网格和命令删除选定的行挂起了一段时间之前,它崩溃。
为了解决这个问题,我想使用bash命令/python脚本。有没有人知道一些快速简单的方法,我可以用它来搜索右列中等于1的示例,并删除它和左列中的数据?
3条答案
按热度按时间i34xakig1#
我决定硬编码我想做的事情,然后很快意识到它在Python中有一个非常简单的解决方案:
这将读入原始文件,并将右列中不包含“1”的所有行写出到单独的文件中。我认为如果你使用
pandas
包,有一个更简单的解决方案,但这对我来说很有效。如果有人遇到这样的问题,请使用此脚本!bqf10yzr2#
grep可以快速排除以1结尾的行。
更复杂的文件可能有多个列和值,但您的文件应该可以使用这些。
s4n0splo3#
您的数据看起来相当简单:列、选项卡和最后一列。您希望隐藏第二列(最后一列)中包含1的行。
你可以使用grep来匹配一个制表符(
\t
),后跟一个1,后跟一个行尾($
)的行,然后反转匹配(使用-v):如果您需要从命令行一致地操作CSV/TSV,我推荐使用合法的CSV工具,如csvkit或GoCSV。我真的不喜欢csvkit的所有选项,它要么覆盖其他选项或只是似乎不工作;它也是用Python写的,所以如果数据集很大,与GoCSV之类的东西相比,你可能会受到一些性能上的损失。在我看来,GoCSV真正继承了许多小工具的UNIX哲学,这些工具擅长做一件事,而且只做一件事。
GoCSV命令假设有一个标题行,因此您必须添加一个(仅用于处理):
然后将其导入过滤器,然后斩首(以去除中间头):
像grep一样,结果是流式的(在管道中),因此内存开销可以忽略不计。