Insere uma string ou linha em branco após um critério de busca específico, em um loop

0

Eu estou querendo saber se alguém poderia me ajudar com uma questão específica de codificação. Eu tenho um arquivo de seqüenciamento de DNA que lê algo assim (como um exemplo):

Plate1A1_R1_AGTAGTACGACTAGCATCAGCATACGATCAGCATCAGCATCAG
Plate1A1_R1_GTAGATCGATGCATGCATGCTAGCTAGCTAGCTAGCTAGCTAA
Plate1A1_R1_AGCTAGCATCGATCGATGCTAGCATGCATCGATCGATGCATGC
Plate1A1_R2_AGCATCGATGCAGCATGCTAGCTAGCTAGCTAGCAGCTAGTCT
Plate1A1_R2_AGCATGCATCGATCGTAGCTAGCAGCGAGCGGCATCGATCGAT
Plate1A2_R1_CAGCTAGATGCATCGATCGATCGATCGATCGATGCTAGCTTAC
Plate1A2_R1_CAGTAGCATGCATGCATGCATGCATGCATCGATGCTAGCTAGC
Plate1A2_R1_ACAACGTAGCTAGCTAGCTACTACTAGTCATCATCGATGCTAG
Plate1A2_R1_CAGCTAGCTAGCTAGCTAGGCTACATCGATCGTAGCTAGTCGA
Plate1A2_R1_CAGTCAGCATGCTATCGATCGTAGCTAGTCATCGATGTAGTGA
....etc.

Você pode ver que existem linhas que pertencem ao mesmo padrão inicial similar (aqui: Plate1A1_R1, Plate1A1_R2, Plate1A2_R1). Gostaria de colocar uma linha em branco após cada agrupamento, por exemplo:

Plate1A1_R1_AGTAGTACGACTAGCATCAGCATACGATCAGCATCAGCATCAG
Plate1A1_R1_GTAGATCGATGCATGCATGCTAGCTAGCTAGCTAGCTAGCTAA
Plate1A1_R1_AGCTAGCATCGATCGATGCTAGCATGCATCGATCGATGCATGC

Plate1A1_R2_AGCATCGATGCAGCATGCTAGCTAGCTAGCTAGCAGCTAGTCT
Plate1A1_R2_AGCATGCATCGATCGTAGCTAGCAGCGAGCGGCATCGATCGAT

Plate1A2_R1_CAGCTAGATGCATCGATCGATCGATCGATCGATGCTAGCTTAC
Plate1A2_R1_CAGTAGCATGCATGCATGCATGCATGCATCGATGCTAGCTAGC
Plate1A2_R1_ACAACGTAGCTAGCTAGCTACTACTAGTCATCATCGATGCTAG
Plate1A2_R1_CAGCTAGCTAGCTAGCTAGGCTACATCGATCGTAGCTAGTCGA
Plate1A2_R1_CAGTCAGCATGCTATCGATCGTAGCTAGTCATCGATGTAGTGA

....etc.

Isso significa que eu preciso conseguir os 11 primeiros caracteres de cada linha, pesquisar onde esse padrão não ocorre mais na linha abaixo e inserir uma linha em branco nesse ponto.

Eu tentei sed e awk esforços com loops 'while read line', mas parece que não consigo encontrar os 11 primeiros caracteres em uma variável de busca para serem usados através das linhas consecutivas de um arquivo de texto, se essa variável de pesquisa estiver "presa" no processamento de uma linha individual.

Espero que alguém possa ajudar com uma solução que permita que o arquivo de referência seja acessado com um redirecionamento ( < ) (com centenas de linhas de dados de sequência de DNA nesse formato e algumas centenas distintas) nomes de placas 'definidos como o script percorre o arquivo linha por linha), por exemplo while read line ; do echo "${line:0:11}" ; done < filename.txt

    
por kehmsen 25.03.2016 / 02:17

2 respostas

1

Eu gerenciei isso usando apenas os comandos bash :

p=; while read l; do [ "$p" -a "${l:0:11}" != "${p:0:11}" ] && echo; echo "$l"; p="$l"; done < FileName

Aqui l é a linha atual e p é anterior, adicionar "$p" -a impede uma linha em branco inicial e && é uma maneira mais compacta de expressar if .

    
por 25.03.2016 / 03:03
0

uma solução awk (semelhante à do AFH)

awk 'NR == 1 { prev=substr($0,1,11) ; } 
     NR >  1 { pref=substr($0,1,11) ; if ( prev != pref ) printf "\n" ; prev=pref ; } 
     {print ; } ' file

onde

  • prev / pref significa anterior / prefixo
  • NR : número de registros (que é o número da linha, se houver um arquivo)
por 25.03.2016 / 11:03