Saída de algumas seções de um arquivo de texto [closed]

2

Eu inseri como o seguinte:

>gi|481443199|gb|MH447771.1|
49      0       0       0       1
50      0       0       1       0
>gi|987078004|gb|RTYJ01067061.1|
412     0       0       1       0
413     1       0       0       0
>gi|557075006|gb|ERTJ01078061.1|
41     0       0       1       0
41     1       0       0       0
>gi|787073002|gb|WERJ01045061.1|
612     0       0       1       0
613     1       0       0       0
>gi|887079001|gb|WERJ01045061.1|
715     0       0       1       0
716     1       0       0       0

Eu quero imprimir algumas linhas, mas pule todas as outras linhas que comecem com > (junto com todas as linhas depois dela, até o subseqüente > ). Para o exemplo de entrada acima, a saída seria:

>gi|481443199|gb|MH447771.1|
49      0       0       0       1
50      0       0       1       0
>gi|557075006|gb|ERTJ01078061.1|
41     0       0       1       0
41     1       0       0       0
>gi|887079001|gb|WERJ01045061.1|
715     0       0       1       0
716     1       0       0       0

Como posso fazer isso?

    
por jack 12.10.2012 / 17:44

4 respostas

8

Para pular todos os outros > ... block:

 awk '/^>/ { p = !p } p' input.txt

p é um sinalizador de impressão - p significa impressão quando p for verdadeiro, pois a ação padrão é print quando nenhum é fornecido. Em awk , as variáveis começam vazias, o que resulta em false em contextos booleanos. Toda vez que uma linha > ... for atingida, alterne o sinalizador p .

Para imprimir todos os blocos n th delimitados por > ... lines:

awk -v n=200 '/^>/ { if (skip == 0) skip = n - 1; else --skip; } skip == n - 1' input.txt

É uma lógica semelhante, exceto que n não é 2, temos que usar um contador em vez de um sinalizador booleano. Aqui, skip conta quantas mais > ... linhas para pular antes de começar a imprimir novamente. Estou usando skip == n - 1 como o sinalizador de impressão como um atalho.

    
por 12.10.2012 / 17:49
3

Para o awk você pode fazer:

awk 'BEGIN{pr=true}/^>/{pr=!pr}{if (pr) {print}}'

Isso define um sinalizador (pr) para quando imprimir, ou seja, toda a aparência do seu token.

    
por 12.10.2012 / 17:50
3
$ awk '/^>/{f=f?0:1;}f' file

Basta ativar e desativar uma variável de sinalizador em uma linha que começa com '^'. Quando está ligado, imprime linhas, senão não.

    
por 12.10.2012 / 17:52
1

Para uma solução mais geral, você pode tentar isso:

awk 'k%10==0{print} /^>/ {k++}' input.txt

Isso incrementa a variável k toda vez que uma linha começa com > e imprime as linhas se k módulo 10 for 0. Então, se você quiser imprimir toda segunda linha, altere k%10==0 para k%2==0 , para cada 200ª linha mude para k%200==0 etc.

AVISO: Nesta versão, a primeira linha será SEMPRE impressa.

    
por 12.10.2012 / 18:12

Tags