grep lista de nomes e informações de arquivo maior

3

Eu tenho dois arquivos: um com lista de nomes (500 entradas) e outro com mais algumas informações para cada entrada em A.txt e entradas extras também.

Arquivo A.txt (cada linha está começando com > (formato fasta) e possui espaços, dígitos e caracteres especiais também, mas em uma única linha)

>xyz, B=123 
>abc, B=231
>mnp, B=567

Arquivo B.txt (tem algumas informações específicas para cada entrada em A.txt na próxima linha e tem entradas extras que o arquivo A)

>xyz, B=123
01010101010100101
>abc, B=231
1011110000011100000000
>mnp, B=567
10101
>opq, B=678
101010101010101001
>lmn, B=123
101010100000011

Resultado

>xyz, B=123
01010101010100101
>abc, B=231
1011110000011100000000
>mnp, B=567
10101

Eu quero grep as entradas na lista A.txt da lista B.txt

obrigado

    
por Roli 24.08.2012 / 17:30

1 resposta

4

Supondo que você queira imprimir apenas duas linhas para cada correspondência, com GNU ou FreeBSD grep, você pode passar A.txt como uma lista de padrões para grep e dizer para imprimir a linha após a partida. Isso produz linhas extras com apenas -- entre cada partida, você pode facilmente removê-las com uma chamada extra para o grep.

grep -A1 -Ff A.txt B.txt | grep -vx -- '--'

Se o número de linhas por seção não for fixo, você pode usar o awk. Primeiro leia o arquivo que contém o texto a ser procurado e, em seguida, para cada linha em B.txt que inicia uma nova seção, inicie ou pare a impressão, dependendo de o cabeçalho da seção estar em A.txt ou não.

awk -v patterns_file=A.txt '
  BEGIN {
    while (getline <patterns_file) patterns_array[$0] = 1;
    close(patterns_file);
  }
  /^/ { matching = $0 in patterns_array }
  matching { print }
' B.txt
    
por 26.08.2012 / 02:59