Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.5K
Vistas
¿Cómo cambiar el nombre del encabezado Fasta según el nombre de archivo en varios archivos?

Tengo un directorio con varios archivos fasta llamados de la siguiente manera:

 BC-1_bin_1_genes.faa BC-1_bin_2_genes.faa BC-1_bin_3_genes.faa BC-1_bin_4_genes.faa

etc. (alrededor de 200 archivos individuales)

El encabezado fasta se ve así:

 >BC-1_k127_3926653_6 # 4457 # 5341 # -1 # ID=2_6;partial=01;start_type=Edge;rbs_motif=None;rbs_spacer=None;gc_cont=0.697

Ahora quiero agregar el nombre del archivo al encabezado porque quiero anotar las secuencias para cada archivo. Intenté lo siguiente:

 for file in *.faa; do sed -i "s/>.*/${file%%.*}/" "$file" ; done

Funcionó parcialmente pero eliminó el ">" del encabezado que es esencial para el archivo fasta. Traté de modificar la parte "${file%%.*}" para mantener la zanahoria, pero siempre me llamó la atención sobre sustituciones incorrectas.

También probé esto:

 awk '/>/{sub(">","&"FILENAME"_");sub(/\.faa/,x)}1' *.faa

Esto funcionó en teoría, pero solo imprimió todo en mi terminal en lugar de cambiarlo en los archivos respectivos.

¿Alguien podría ayudar con esto?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

No está claro si desea reemplazar el encabezado anterior o agregarlo. Ambos escenarios son fáciles de hacer. No reemplace el texto que no desea reemplazar.

 for file in ./*.faa; do sed -i "s/^>.*/>${file%%.*}/" "$file" done

reemplazará el encabezado, pero incluirá un > inicial en el reemplazo, preservándolo efectivamente; y

 for file in ./*.faa; do sed -i "s/^>.*/&${file%%.*}/" "$file" done

agregará el nombre del archivo al final del encabezado ( & en la cadena de reemplazo se evalúa como la cadena que estamos reemplazando, nuevamente preservándola de manera efectiva).

Para otra variación, intente

 for file in *.faa; do sed -i "/^>/s/\$/ ${file%%.*}/" "$file" done

que dice en las líneas que coinciden con la expresión regular ^> , reemplace la cadena vacía al final de la línea $ con el nombre del archivo.

Por supuesto, su secuencia de comandos Awk también podría repararse fácilmente. Standard Awk no tiene una opción para comparar la opción -i "en el lugar" de sed , pero puede usar fácilmente un archivo temporal:

 for file in ./*.faa; do awk '/>/{ $0 = $0 " " FILENAME);sub(/\.faa/,"")}1' "$file" >"$file.tmp" && mv "$file.tmp" "$file" done

GNU Awk también tiene una extensión -i inplace el lugar que simplemente puede agregar a las opciones de su script existente si tiene GNU Awk.

Dado que los archivos FASTA suelen contener múltiples encabezados, parece más útil agregar al encabezado en lugar de reemplazar todos los encabezados en un archivo con la misma cadena, así que cambié su secuencia de comandos Awk para hacer eso.

Por lo que vale, el nombre del personaje ^ es caret (zanahoria es 🥕). El carácter > se llama mayor que o paréntesis de ángulo recto, o división derecha o, a veces, simplemente cuña.

over 4 years ago · Santiago Trujillo Denunciar

0

Solo necesita detectar el patrón para reemplazar y usar expresiones regulares para implementarlo:

fasta_helper.sh

 location=$1 for file in $location/*.faa do full_filename=${file##*/} filename="${full_filename%.*}" #scape special chars filename=$(echo $filename | sed 's_/_\\/_g') echo "adding file name: $filename to: $full_filename" sed -i -E "s/^[^#]+/>$filename /" $location/$full_filename done

uso:

Solo pasa la carpeta con los archivos fasta:

bash fasta_helper.sh /foo/bar

prueba:

ingrese la descripción de la imagen aquí

conferencias

  • Regex: coincidencia con la primera aparición de un carácter
  • Extraer nombre de archivo y extensión en Bash
  • https://unix.stackexchange.com/questions/78625/using-sed-to-find-and-replace-complex-string-preferrably-with-regex
over 4 years ago · Santiago Trujillo Denunciar

0

Localizando sus archivos

Sugiriendo identificar primero sus archivos con el comando find o el comando ls .

 find . -type f -name "*.faa" -printf "%f\n"

Un comando de find para imprimir solo archivos con extensión de nombre de archivo .faa . Incluyendo subdirectorios al directorio actual.

 ls -1 "*.faa"

Un comando ls para imprimir archivos y directorios con extensión .faa . En el directorio actual.

Procesando sus archivos

Una vez que tenga la lista de archivos correcta, repita la lista y aplique el comando sed .

 for fileName in $(find . -type f -name "*.faa" -printf "%f\n"); do stripedFileName=${fileName/.*/} # strip extension .faa sed -i "1s|\$| $stripedFileName|" "fileName" # append value of stripedFileName at end of line 1 done
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda