Removendo caracteres específicos e imprimindo em linhas separadas

2

Eu preciso da sua ajuda e orientação urgente, eu tenho um arquivo no qual há milhares de seqüências, das quais eu quero clivar K e R e colar as seqüências restantes linha por linha. Arquivo A:

MSTNPKPQRK  TKRNTNRRPE  DVKFPGGQI

Saída desejada:

MSTNP
PQ
T
NTN
PE
DV
FPGGQI

Depois de obter essa saída, quero pesquisar sequências individuais no arquivo B (banco de dados de seqüências)

    
por Rhea 16.06.2017 / 06:48

3 respostas

2

com sed :

sed 's/[KR[:blank:]]\+/\n/g' A.txt
  • sed 's/[KR[:blank:]]\+/\n/g' A.txt substitui todos os um ou mais K , R e espaço / tab com nova linha de A.txt

com awk :

awk -F '[KR[:blank:]]+' '{for(i=1; i<=NF; i++) print $i}' A.txt
  • -F '[KR[:blank:]]+' define o separador de campo como um ou mais K , R , espaço / tabulação

  • {for(i=1; i<=NF; i++) print $i} itera e imprime os campos

Você pode aproveitar awk para pesquisar padrões resultantes em outro arquivo usando os dois arquivos como argumentos e trabalhando a partir daí.

Mais genérico seria usar grep para obter padrões de um nome de arquivo de entrada, você pode usar a substituição de processo para obter um descritor de arquivo:

grep -f <(awk/sed ... A.txt) B.txt

Para correspondência exata, adicione -F :

grep -Ff <(awk/sed ... A.txt) B.txt

Exemplo:

% cat A.txt 
MSTNPKPQRK  TKRNTNRRPE  DVKFPGGQI

% sed 's/[KR[:blank:]]\+/\n/g' A.txt
MSTNP
PQ
T
NTN
PE
DV
FPGGQI

% awk -F '[KR[:blank:]]+' '{for(i=1; i<=NF; i++) print $i}' A.txt 
MSTNP
PQ
T
NTN
PE
DV
FPGGQI
    
por heemayl 16.06.2017 / 06:58
0

A obtenção da saída desejada pode ser feita de várias maneiras diferentes. Perl e Awk apresentados abaixo trabalham exatamente da mesma maneira. Você pode redirecionar qualquer comando usando o operador > para o arquivo e, em seguida, usar grep -f pattern.txt data.txt

Por exemplo, com o perl apresentado abaixo, podemos fazer:

 perl -ne '@s=split /[KR ]/,$_; foreach(@s){ print "$_\n" if !/^$/}'  input.txt  > pattern.txt && grep -f pattern.txt data.txt 

Perl

A abordagem perl é efetivamente a mesma que o AWK explicado abaixo: dividir a linha em colunas usando K, R e espaço como separadores e depois iterar sobre todas elas imprimindo apenas colunas não vazias.

$ perl -ne '@s=split /[KR ]/,$_; foreach(@s){ print "$_\n" if !/^$/}'  input.txt          
MSTNP
PQ
T
NTN
PE
DV
FPGGQI

AWK

$ awk -F '[KR ]' 'BEGIN{OFS="\n"};{=;print}' input.txt  | awk '!/^$/'                              
MSTNP
PQ
T
NTN
PE
DV
FPGGQI

Pontos-chave de como isso funciona:

  • -F nos permite usar espaço, K e R como separadores para colunas (também conhecidos como campos).
  • BEGIN{OFS="\n"} nos permite usar nova linha como separador de saída para que os itens saiam separados por nova linha
  • Para aplicar o novo OFS, acionamos a reconstrução da linha de texto por meio da atribuição = e, por fim, imprimimos a linha.
  • devido a vários separadores de coluna K, R e espaço adjacentes (por exemplo, em PQRK ), temos que filtrar linhas vazias do primeiro awk, que é o que o segundo awk está fazendo.
por Sergiy Kolodyazhnyy 16.06.2017 / 07:11
0

Substitua os caracteres K , R e espaço em branco por novas linhas, pressionando várias instâncias:

$ tr -s '[KR[:space:]]' '\n' < file
MSTNP
PQ
T
NTN
PE
DV
FPGGQI
    
por steeldriver 16.06.2017 / 11:12