Usando o grep no shell script

0

Eu tenho um arquivo de texto que se parece com isso (estou mostrando algumas linhas dele)

INDEX : 1
snRNA_seq:TTTTGGAGCAGGGAGATGGAAT

miRNA_seq:CTCCTGACTCCAGGTCCTGTGT

target: RNU2-1,RNU2-64P,RNU2-37P,RNU2-61P,RNU2-68P,RNU2-26P,RNU2-57P,RNU2-59P
length: 22
miRNA: hsa-miR-378a-5p*MI0000786
length: 22


mfe: -21.3 kcal/mol

p-value: 0.015469



position  1

target 5'        U             A 3'

                  UUUGGAG CAGGG    

                  GGACCUC GUCCU    

miRNA  3' UGUGUCCU       A     C 5'





INDEX : 10
snRNA_seq:TTGGAGCAGGGAGATGGAAT

miRNA_seq:ATCCTCTCTTCCCTCCTCCCAG

target: RNU2-1,RNU2-64P,RNU2-37P,RNU2-61P,RNU2-68P,RNU2-26P,RNU2-57P,RNU2-59P
length: 20
miRNA: hsa-miR-7111-3p*MI0022962
length: 22


mfe: -24.0 kcal/mol

p-value: 0.001695



position  2

target 5'   U    C        U    A 3'

             GGAG AGGG AGA  GGA    

             CCUC UCCC UCU  CCU    

miRNA  3' GAC    C    U   CU   A 5'

Eu tenho uma lista de identificadores, ou seja, 1,10,20,30, etc. Este identificador no arquivo acima está ao lado da parte INDEX. Tudo que eu quero fazer é se o identificador coincide com o arquivo acima imprimir essa linha + próxima 28 linhas basicamente alguma coisa como esta grep -A 28 "INDEX: identifier"

Como posso fazer isso no shell ??

Atenciosamente

    
por user3138373 25.02.2015 / 19:06

3 respostas

1

Quando tiver entradas fixas para os identificadores que você gosta, você pode usar

for identifier in 1 10 20 30; do
   grep -A 28 "INDEX : ${identifier}$" Test.txt
done

Quando você não tem identificadores fixos, você pode grep sem especificar o identificador:

grep -A 28 "^INDEX : " Test.txt

Eu uso ^ aqui para corresponder as linhas INDEX no começo da linha.

    
por 25.02.2015 / 20:01
1

Você pode usar grep com -f :

   -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.

mas para isso você precisa formatar o arquivo identifiers de acordo, por exemplo deveria ler:

INDEX : 1
INDEX : 10
..........
INDEX : 100

em vez de:

1,10....100

Se você usar - como FILE grep , ele lerá padrões de stdin , portanto, com awk (e também usando grep com -x para corresponder à linha inteira):

awk -F, '{for (i=1; i<=NF; i++) print "INDEX : "$i}' identifiers | grep -A28 -x -f - file

A menos que você queira usar sua ferramenta favorita para editar identifiers no lugar e, em seguida, executar:

grep -A28 -x -f identifiers file
    
por 25.02.2015 / 21:25
0

Se você quiser evitar uma passagem múltipla através de seus dados com um subconjunto fixo de IDs fornecido, essa é uma maneira possível (para os índices de amostra 1, 2, 10):

sed -n '/INDEX : \(1\|2\|10\)$/,+28p'
    
por 27.02.2015 / 17:35

Tags