Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.5K
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda