extrai o bloco de texto de outro arquivo

0

Eu quero extrair o bloco de texto baseado em ids presentes em outro arquivo,

Entrada

>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

output.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

então eu quero um bloco de texto para os IDs presentes no id.txt Existe alguma maneira de fazer isso?

    
por Namrata Patel 06.01.2018 / 18:15

3 respostas

2

Solução awk curta:

awk 'NR==FNR{ a[$1]; next }/^>Feature/{ f=($2 in a) }f' id.txt input.txt
  • NR==FNR{ ... } - processando o primeiro arquivo de entrada (ou seja, id.txt ):
    • a[$1] - capturando cada "scaffold" id no array a
    • next - pula para o próximo registro
  • /^>Feature/ - ao encontrar linha padrão começando com >Feature (ao processar o segundo arquivo de entrada input.txt ):
    • f=($2 in a) - define f flag atividade dependendo da ocorrência atual do "scaffold" id (aparece como o segundo campo $2 ) na matriz de ids a
    • f - dependendo da atividade desse sinalizador, qualquer bloco será ou não processado

A saída:

>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
    
por 06.01.2018 / 18:35
1

Solução de 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};
}

Primeiramente, ele carrega os ids em um hash, depois lê o arquivo de entrada linha a linha, define o id atual, se necessário, e verifica o hash se o id atual está armazenado ou não, e imprime a linha apenas para o id armazenados.

    
por 06.01.2018 / 18:32
0

Eu fiz pelo método abaixo

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

saída.

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
    
por 07.01.2018 / 01:40