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.faaetc. (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.697Ahora 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" ; doneFuncionó 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' *.faaEsto 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?
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.
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 doneuso:
Solo pasa la carpeta con los archivos fasta:
bash fasta_helper.sh /foo/bar
prueba:
conferencias
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.
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