Insere uma string ou linha após a última instância de uma variável de busca específica, em um loop

2

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, procurar onde esse padrão não mais ocorra na linha abaixo e inserir uma linha em branco nesse ponto.

Eu tentei sed e awk esforços com while read line loops, mas parece que não consigo encontrar os 11 primeiros caracteres em uma variável de pesquisa para ser usado 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 referenciado seja acessado com um redirecionamento (<) (com centenas de linhas de dados de seqüência de DNA nesse formato e algumas centenas de placas distintas) nomes 'definidos como o script percorre o arquivo linha por linha), por exemplo

while read line ; do echo "${line:0:11}" ; done < filename.txt

Obrigado por qualquer sugestão!

    
por kehmsen 25.03.2016 / 02:27

1 resposta

2

awk '{
  thisplate=substr($0, 1, 11); 
  if (thisplate != plate) { 
    print ""; 
    plate=thisplate 
  };
  print }' < input | sed '1d'

Esta é uma versão mais longa do comentário de Sukminder que acabou de chegar; salva o prefixo 11-charcter e imprime uma nova linha se o novo prefixo for diferente do prefixo anterior. O sed exclui a primeira linha vazia.

    
por 25.03.2016 / 02:42