다른 파일에서 텍스트 블록 추출

다른 파일에서 텍스트 블록 추출

다른 파일에 있는 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

관련 정보