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

141
Vistas
Recorriendo pares de archivos

Hola, necesito iterar sobre pares de archivos y hacer algo con ellos.

Por ejemplo, tengo 4 archivos que se llaman AA2234_1.fastq.gz AA2234_2.fastq.gz AA3945_1.fastq.gz AA3945_2.fastq.gz

Como puede ver, los pares son AA2234_1.fastq.gz <-> AA2234_2.fastq.gz y AA3945_1.fastq.gz <-> AA3945_2.fastq.gz (comparten el nombre antes del signo _ )

Tengo un command con sintaxis que se parece a esto:

initialize_of_command file1 file2 output_a output_b output_c output_d parameteres

Quiero que este script encuentre la cantidad de archivos con la extensión fastq.gz en un directorio, los divida por 2 para encontrar la cantidad de pares, luego haga coincidir los pares usando probablemente expresiones regulares (tal vez a dos variables) y ejecute este command para cada par una vez .

No tengo idea de cómo emparejar esos archivos usando expresiones regulares y cómo iterar sobre los pares para que los scripts sepan a través de qué pares ya ha iterado.

Aquí está mi guión sin terminar:

 #!/bin/bash raw_count_of_files=$(ls | grep -c "fastq.gz") count_of_files=$((raw_count_of_files / 2)) for ((i=1;i<=count_of_files;i++)); do java -jar /home/aa/git/trimmomatic/src/Trimmomatic/trimmomatic-0.39.jar PE -phred33 AA2234_1.fastq.gz AA2234_2.fastq.gz AA2234_forward_paired.fq.gz AA2234_forward_unpaired.fq.gz AA2234_reverse_paired.fq.gz AA2234_reverse_unpaired.fq.gz SLIDINGWINDOW:4:20 MINLEN:20; done

También me gustaría que los nombres de salida tengan el nombre compartido de los archivos de entrada, que en este caso es AA2234 y AA3945

El resultado deseado de este script debe ser de 8 archivos nombrados de acuerdo a los pares:

 AA2234_forward_paired.fq.gz AA2234_forward_unpaired.fq.gz AA2234_reverse_paired.fq.gz AA2234_reverse_unpaired.fq.gz

y

 AA3945_forward_paired.fq.gz AA3945_forward_unpaired.fq.gz AA3945_reverse_paired.fq.gz AA3945_reverse_unpaired.fq.gz
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Una forma de iterar sobre pares de argumentos:

 #!/usr/bin/env sh proc_fastq_pairs() { # loop while there are fastq files passed as argument while [ $# -gt 0 ]; do fq1=$1 # consume 1 argument as file 1 shift fq2=$1 # consume 1 argument as file 2 shift initialize_of_command "$fq1" "$fq2" output_a output_b output_c output_d parameteres done } initialize_of_command() { # dummy command to show passed arguments for debug purpose printf 'initialize_of_command %s\n' "$*" } # Expansion of the globbing pattern ./*.fastq.gz # is always sorted alphabetically. # It ensures all similarly named files are kept # togaether fq1 fq2 ... proc_fastq_pairs ./*.fastq.gz

Alternativamente con xargs :

 printf '%s\n' ./*.fastq.gz | xargs -L 2 bash -c 'initialize_of_command "$1" "$2" output_a output_b output_c output_d parameteres' _
over 4 years ago · Santiago Trujillo Denunciar

0

Suponiendo que los nombres de los archivos no contengan espacios en blanco, ¿podría intentar:

 #!/bin/bash declare -A hash # associative array to tie basename with files for f in *fastq.gz; do # search the files with the suffix base=${f%_*} # remove after "_" if [[ -z ${hash[$base]} ]]; then # if the variable is not defined hash[$base]=$f # then store the filename else hash[$base]+=" $f" # else append the filenmame delimited by the whitespace fi done for base in "${!hash[@]}"; do # loop over the hash keys (basename) read -r f1 f2 <<< "${hash[$base]}" # split into filenames echo java -jar /home/aa/git/trimmomatic/src/Trimmomatic/trimmomatic-0.39.jar PE -phred33 "$f1" "$f2" "$base"_forward_paired.fq.gz "$base"_forward_unpaired.fq.gz "$base"_reverse_paired.fq.gz "$base"_reverse_unpaired.fq.gz SLIDINGWINDOW:4:20 MINLEN:20; done

El script genera las líneas de comandos de Java como una ejecución en seco. Si la salida se ve bien, suelte echo y ejecute.

over 4 years ago · Santiago Trujillo Denunciar

0

#!/bin/bash declare -A assoc=() shopt -s nullglob for f in *_?.fastq.gz; do base=${f%_*} assoc[$base]=${assoc[$base]-}${assoc[$base]+ }$f done set -f for pair in "${assoc[@]}"; do set -- $pair # TODO: Check $# and do something with $1 and $2 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