csv 如果第二列中的值为1,则删除tsv文件中的行

9o685dep  于 2023-09-28  发布在  其他
关注(0)|答案(3)|浏览(114)

我有一个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的示例,并删除它和左列中的数据?

i34xakig

i34xakig1#

我决定硬编码我想做的事情,然后很快意识到它在Python中有一个非常简单的解决方案:

import csv

kmercount = "originalFile.tsv"
kmerout = "cleanFile.tsv"

with open(kmercount, "r") as file, open(kmerout, "w") as out:
    read = csv.reader(file, delimiter = "\t")
    writer = csv.writer(out, delimiter = "\t")

    for row in read:
        if row[1] != "1":
            writer.writerow(row)

这将读入原始文件,并将右列中不包含“1”的所有行写出到单独的文件中。我认为如果你使用pandas包,有一个更简单的解决方案,但这对我来说很有效。如果有人遇到这样的问题,请使用此脚本!

bqf10yzr

bqf10yzr2#

grep可以快速排除以1结尾的行。

grep -v " 1$" file.tsv > filteredFile.tsv

更复杂的文件可能有多个列和值,但您的文件应该可以使用这些。

s4n0splo

s4n0splo3#

您的数据看起来相当简单:列、选项卡和最后一列。您希望隐藏第二列(最后一列)中包含1的行。
你可以使用grep来匹配一个制表符(\t),后跟一个1,后跟一个行尾($)的行,然后反转匹配(使用-v):

grep -v '\t1$' input.tsv
AAAAAAAAAAAAAAAAAA  122363
GTCTGACATCTTACATGA  3
TTAAAAAAATTTTGCCTT  9
TTTTTTAGACGAAAACTA  30
GACTCCTGGTCACGTAAG  12
TGGTTTTTGTTTTGTAAT  58

如果您需要从命令行一致地操作CSV/TSV,我推荐使用合法的CSV工具,如csvkitGoCSV。我真的不喜欢csvkit的所有选项,它要么覆盖其他选项或只是似乎不工作;它也是用Python写的,所以如果数据集很大,与GoCSV之类的东西相比,你可能会受到一些性能上的损失。在我看来,GoCSV真正继承了许多小工具的UNIX哲学,这些工具擅长做一件事,而且只做一件事。
GoCSV命令假设有一个标题行,因此您必须添加一个(仅用于处理):

export GOCSV_DELIMITER="\t"
gocsv cap --default-name Col input.tsv
Col 1   Col 2
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

然后将其导入过滤器,然后斩首(以去除中间头):

gocsv cap --default-name Col input.tsv | gocsv filter -c 'Col 2' -eq 1 -exclude | gocsv behead

像grep一样,结果是流式的(在管道中),因此内存开销可以忽略不计。

相关问题