Insertar una cadena o una línea en blanco después de criterios de búsqueda específicos, en un bucle

0

Me pregunto si alguien podría ayudarme con una pregunta de codificación específica. Tengo un archivo de secuenciación de ADN que lee algo como esto (como ejemplo):

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.

Puede ver que hay líneas que pertenecen al mismo patrón de inicio similar (aquí: Plate1A1_R1, Plate1A1_R2, Plate1A2_R1). Me gustaría colocar una línea en blanco después de cada agrupación, por ejemplo:

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.

Esto significa que necesito poder capturar los primeros 11 caracteres de cada línea, buscar dónde ya no aparece ese patrón en la línea de abajo e insertar una línea en blanco en ese punto.

He intentado los esfuerzos de sed y awk con los bucles 'mientras se lee la línea', pero parece que no puedo encontrar una manera de mantener los primeros 11 caracteres en una variable de búsqueda para usar a través de las líneas consecutivas de un archivo de texto, si esa búsqueda La variable está 'bloqueada' en el procesamiento de una línea individual.

Espero que alguien pueda ayudar con una solución que permita acceder al archivo de referencia con una redirección ( < (con cientos de líneas de datos de secuencia de ADN en este formato y un par de cientos de 'nombres de placas' definidos a medida que el script se mueve a través del archivo línea por línea), p. ej. while read line ; do echo "${line:0:11}" ; done < filename.txt

kehmsen
fuente

Respuestas:

1

Logre esto usando solo bash comandos:

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

aquí l es la linea actual y p es lo anterior, sumando "$p" -a evita una línea en blanco inicial, y la && Es una forma más compacta de expresar. if.

AFH
fuente
0

una solución awk (similar a la de 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

dónde

  • prev / pref soporte para el anterior / prefijo
  • NR : número de registro (es decir, número de línea si hay un archivo)
Archemar
fuente