从文本文件中提取行的命令行工具

从文本文件中提取行的命令行工具

我有一个大文件(例如reads.fasta),大约有 5,000,000 行,还有另一个文件,其中包含我想要提取的reads_of_interest行号列表。reads.fasta

有一个简单的命令行方法可以做到这一点吗?

换句话说,有一个文件large_file.txt。还有另一个文件line_numbers.txt的形式

12 
134
1456

我想从 中提取行12, 134, 。我想要提取的行数约为 500,000 行。1456large_file.txt

谢谢!

答案1

这是获得您想要的东西的简单而直接的方法。这里的问题是整个large_file.txt都会被扫描。如果这太慢了,还有其他事情可以尝试。其中之一是将文件加载到按行号键入的数据库中,与扫描文件相比,这将提供极快的检索速度。

#!/bin/sh
awk '
    NR == FNR {
        for (i=1; i<=NF; i++) {
            linenums[$i]
        }
    }
    NR != FNR {
        if (FNR in linenums) {
            print
        }
    }
' line_numbers.txt large_file.txt

NR是当前记录号(Number of Records),FNR是当前文件内的当前记录号。

因此,当NR == NFRawk 处理第一个文件 arg 时,何时NR != NFR awk处理第二个(或更高版本)文件。

这会读取所有行号line_numbers.txt并将它们作为键存储到一个没有数据元素、只有键(数组linenums)的数组中。

large_file.txt当读取第二个文件 时,如果当前记录号已作为键存储在数组 中,则将打印linenumsfrom 的行。large_file.txt

在数组中查找行号的方法linenums相对较快,因为awk使用内部哈希算法来查找键。

答案2

假设 file_numbers.txt 包含一行,并且该行不太大,则以下内容应该有效

sed -n "$(<file_numbers.txt sed -e "s/ /p;/g" -e "s/$/p/")" large_file.txt

相关内容