我有一个大文件(例如reads.fasta
),大约有 5,000,000 行,还有另一个文件,其中包含我想要提取的reads_of_interest
行号列表。reads.fasta
有一个简单的命令行方法可以做到这一点吗?
换句话说,有一个文件large_file.txt
。还有另一个文件line_numbers.txt
的形式
12
134
1456
我想从 中提取行12
, 134
, 。我想要提取的行数约为 500,000 行。1456
large_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 == NFR
awk 处理第一个文件 arg 时,何时NR != NFR
awk
处理第二个(或更高版本)文件。
这会读取所有行号line_numbers.txt
并将它们作为键存储到一个没有数据元素、只有键(数组linenums
)的数组中。
large_file.txt
当读取第二个文件 时,如果当前记录号已作为键存储在数组 中,则将打印linenums
from 的行。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