我需要浏览一个非常大的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列)。
答案 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 ' ' '|')"