遍历一个非常大的列表

Loop through a really large list

我需要通过一个非常大的 vcf 文件来查找匹配信息(根据列值匹配行)。

到目前为止,这是我尝试过的方法,但它没有用,而且确实有问题。

target_id=('id1' 'id2' 'id3' ...)

awk '!/#/' file_in | cut -f3,10-474|
for id in $target_id
do
    grep "target"
done

它只循环遍历文件以查找 target_id 列表中的第一个 ID。

我想知道是否有一种方法可以遍历文件以查找 target_id 列表中的所有 ID?如果第 3 列匹配,我想输出整行(第 3 列,第 10-474 列)。

您可能会得到与 for 循环相同的行为,使用一次 grep 一次处理一堆 target_id,例如;

egrep "id1|id2|id3"

这可能会提高性能,因为您不必为每个 target_id 派生一个新的 grep 实例。

您提到 file_in(vcf 文件)很大。只要未达到文件系统限制,您就不会遇到麻烦。例如,ext2、ext3 的最大文件大小为 2 Tb,ext4 的最大文件大小为 16 Tb。

如果 $target_id 列表太大,您可能会遇到有关命令行参数大小的问题。

请在下面找到结果代码; (注意 |\ 用于使用多行编写很长的命令。\ 告诉 shell 命令在下一行继续)

#!/bin/bash

target_id="id1 id2 id3"

awk '!/#/' file_in | \
cut -f3,10-474| \
egrep "$(echo $target_id | tr ' ' '|')"