如何过滤 TSV 文件中数十亿行的列

如何过滤 TSV 文件中数十亿行的列

我正在处理一个包含数十亿行数据的列表。

我有这样的数据: 在此输入图像描述

正如您所看到的,在第四列(基因列)中存在基因名称,但并非所有行都有“基因名称”。我需要从第四列获取“基因名称”的完整列表。

我怎样才能得到我需要的东西?

答案1

试试这个单行:

cut -f4 in.tsv | tail -n +2 | grep -P '\S'

详细信息:
cut -f4 in.tsv:输出输入文件的第四个制表符分隔列in.tsv
tail -n +2:删除第一行(标题)。
grep -P '\S':只保留有非空白字符的行,即删除空行。-P告诉grep我们使用 Perl 正则表达式。

如果您只需要唯一的基因名称,请sort -u像这样添加:

cut -f4 in.tsv | tail -n +2 | grep -P '\S' | sort -u

答案2

目前尚不清楚您的要求是什么。假设,排除第一行,只有第四列(标记为“基因”)的值,其第六列(标记为“产品”)的值与“假设蛋白质”不同

grep -v "hypothetical protein" < <(tail -n +2 file.tsv) | cut -f4 -d$'\t'

解释

tail -n +2 file.tsv

排除第一行(“locus_tag”、“type”等)

grep -v "hypothetical protein"

排除包含“假设蛋白质”字符串的所有行

cut -f4 -d$'\t'

打印第四列。

答案3

这看起来像是一个任务awk。您可以尝试:

awk '{if ($4); print $4 $7}' filename.tsv

根据评论中的有用建议:

awk 'BEGIN { FS = "\t" } ; $4 != "" { print $4 "\t" $7}'

答案4

使用 awk:

awk -F'\t' '$4 != "" {arr[$4] = 1} END {for (idx in arr) print idx}' file.tsv
  • -F'\t':在选项卡上拆分。
  • $4 != "":如果第四个字段不为空...
  • {arr[$4] = 1}: …使用它作为数组赋值中的索引。
    • 相同索引的后续实例将覆盖数组条目,不存储重复项。
    • 指定的值 ( 1) 是任意的,0或者"blergh"也可以正常工作。
  • END:当所有行都读完后...
  • {for (idx in arr) print idx}: ...打印所有索引。

相关内容