遍历一个很大的列表

时间:2019-07-19 03:11:24

标签: bash loops large-data large-files

我需要浏览一个非常大的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?如果第三列匹配,我想输出整行(第三列,第10-474列)。

1 个答案:

答案 0 :(得分:0)

例如,一次使用一串grep来获取一串target_id,您可能会得到与for循环相同的行为;

egrep "id1|id2|id3"

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

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

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

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

#!/bin/bash

target_id="id1 id2 id3"

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