다른 파일에 있는 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]
- 모두 캡처"발판"배열에 저장된 IDa
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
펄 솔루션:
#!/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};
}
먼저 ID를 해시에 로드한 다음 입력 파일을 한 줄씩 읽고 필요한 경우 현재 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