从另一个文件中提取文本块

从另一个文件中提取文本块

我想根据另一个文件中存在的 id 提取文本块,

输入

>Feature scaffold1
1   100 g
101 200 g
201 300 g
500 500 r
900 1000    r
>Feature scaffold2
1   100 g
01  500 g
200 300 r
>Feature scaffold3
10  500 g
100 200 r
>Feature scaffold4
10  300 g
500 600 r
>Feature scaffold5
1   1000    r

id.txt

scaffold1
scaffold3
scaffold4

输出.txt

 >Feature scaffold1
 1   100 g
 101 200 g
 201 300 g
 500 500 r
 900 1000    r
 >Feature scaffold3
 10 500 g
 100    200 r
 >Feature scaffold4
 10 300 g
 500    600 r

所以我想要 id.txt 中存在的 id 的文本块 有什么方法可以做到这一点吗?

答案1

短的awk解决方案:

awk 'NR==FNR{ a[$1]; next }/^>Feature/{ f=($2 in a) }f' id.txt input.txt
  • NR==FNR{ ... }- 处理第一个输入文件(即id.txt):
    • a[$1]- 捕捉每一个“脚手架”id 存入数组a
    • next- 跳转到下一条记录
  • /^>Feature/- 遇到以以下开头的模式行>Feature(处理第二个输入文件时input.txt):
    • f=($2 in a)-f根据当前设置标志活动“脚手架”id(显示为第二个字段$2)出现在 ids 数组中a
    • f- 根据此标志的活动,任何块将被或不会被处理

输出:

>Feature scaffold1
1   100 g
101 200 g
201 300 g
500 500 r
900 1000    r
>Feature scaffold3
10  500 g
100 200 r
>Feature scaffold4
10  300 g
500 600 r

答案2

Perl解决方案:

#!/usr/bin/perl
open $ids, '<', 'id.txt' or die $!;
chomp, $h{$_} = 1 while <$ids>;

open $in, '<', 'input.txt' or die $!;
while (<$in>) {
    $id = $1 if />Feature (.*)/;
    print if $h{$id};
}

它首先将 ids 加载到哈希中,然后逐行读取输入文件,如果需要的话设置当前 id,并检查哈希是否存储了当前 id,并仅打印存储的行。

答案3

我已经通过以下方法完成了

for i in  scaffold1 scaffold3 scaffold4
> do
> sed -n "/$i/,/scaffold/p" inputfile | sed '$d'
> done

输出。

Feature scaffold1
1   100 g
101 200 g
201 300 g
500 500 r
900 1000    r
>Feature scaffold3
10  500 g
100 200 r
>Feature scaffold4
10  300 g
500 600 r

相关内容