Como posso executar um comando no mac terminal para vários arquivos em uma pasta de uma só vez?

0

Como posso executar o mesmo comando no mac terminal para vários arquivos em uma pasta? Os arquivos são nomeados como 24538_7#1_paired1.fq , 24538_7#1_paired2.fq , 24538_7#2_paired1.fq , 24538_7#2_paired2.fq , 24538_7#3_paired1.fq , 24538_7#3_paired2.fq e assim por diante.

O comando é:

STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/24538_7#1_paired1.fq data/24538_7#1_paired2.fq --outFileNamePrefix results/STAR/ 

Como o nome do arquivo envolve um contador, obviamente, os nomes dos arquivos precisam ser alterados.

Eu estava tentando escrever o comando, mas está dando uma falha de segmentação. Meu esforço para o comando está abaixo:

for file in 24538_7#*.fq; do STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"${file%.fq}_paired1.fq" data/"${file%.fq}_paired2.fq" --outFileNamePrefix results/STAR/ ; done

(PS - eu uso o MacOS)

    
por Akhil Verma 12.06.2018 / 15:29

2 respostas

1

Faça um loop sobre todos os arquivos paired1.fq e, para cada arquivo, use o nome para calcular o nome do arquivo paired2.fq correspondente. Em seguida, ligue para o seu programa com estes:

for paired1 in data/*paired1.fq; do
    paired2="${paired1%1.fq}2.fq"  # remove 1.fq from end of name and replace with 2.fq

    if [ ! -f "$paired2" ]; then
        printf 'Missing file:\t%s\n' "$paired2" >&2
        continue
    fi

    prefix="${paired1%_*}" # remove last underscore and everything after
    prefix="${prefix##*/}" # remove directory name from prefix

    # If $paired1 is the string "data/24538_7#1_paired1.fq", then
    # $prefix should now be "24538_7#1"

    mkdir -p "results/STAR/$prefix"

    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic \
         --readFilesIn "$paired1" "$paired2" \
         --outFileNamePrefix "results/STAR/$prefix/"
done
    
por 12.06.2018 / 16:03
0

Sua expansão de parâmetro não está aparecendo o suficiente.

Você está configurando file para:

file=24538_7#1_paired1.fq

Em seguida, apara .fq :

$ echo ${file%.fq}
24538_7#1_paired1

Em seguida, adicione _paired1.fq :

$ echo "${file%.fq}_paired1.fq"
24538_7#1_paired1_paired1.fq

Tente assim:

for file in 24538_7#*.fq; do 
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"${file%_paired?.fq}_paired1.fq" data/"${file%_paired?.fq}_paired2.fq" --outFileNamePrefix results/STAR/
done

Isso será executado duas vezes por par, já que cada par tem dois arquivos. Eu acho que pode não ser o que você precisa.

Para executar uma vez por par, você pode fazer algo assim:

#!/bin/bash

files=( 24538_7#*.fq )
files=( printf '%s\n' "${files[@]#24538_7#}" | sort -n | awk -F_ '{print $1}' | uniq )

for n in "${files[@]}"; do
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"24538_7#${n}_paired1.fq" data/"24538_7#${n}_paired2.fq" --outFileNamePrefix results/STAR/ 
done
    
por 12.06.2018 / 15:58