Eu tenho uma pasta com o seguinte conteúdo de arquivo:
ls bams-lab/*.name-sorted.fixmate.sorted.dedup.sam
bams-lab/OZBenth2_.fastp.fq.gz.name-sorted.fixmate.sorted.dedup.sam
...
bams-lab/OZBenth7_.fastp.fq.gz.name-sorted.fixmate.sorted.dedup.sam
Eu tentei criar uma lista de arquivos com o script bash abaixo
#!/bin/bash
# usage: sh merge_sam_pbs.sh /path/to/*.name-sorted.fixmate.sorted.dedup.sam
output=$(dirname $1)
samlist=$(for sam in $1; do echo "I=$sam "; done)
cat << EOF |cat #qsub
#!/bin/bash -l
#PBS -N merge
#PBS -l walltime=150:00:00
#PBS -j oe
#PBS -l mem=70G
#PBS -l ncpus=2
#PBS -M [email protected]
cd \$PBS_O_WORKDIR
conda activate picard
echo $samlist
picard -Xmx10g MergeSamFiles \
$samlist \
O=${output}/merged.sorted.dedup.bam
EOF
mas só pega um arquivo
> sh merge_sam_pbs.sh bams-lab/*.name-sorted.fixmate.sorted.dedup.sam
#!/bin/bash -l
#PBS -N merge
#PBS -l walltime=150:00:00
#PBS -j oe
#PBS -l mem=70G
#PBS -l ncpus=2
#PBS -M [email protected]
cd $PBS_O_WORKDIR
conda activate picard
echo I=bams-lab/OZBenth2_.fastp.fq.gz.name-sorted.fixmate.sorted.dedup.sam
picard -Xmx10g MergeSamFiles I=bams-lab/OZBenth2_.fastp.fq.gz.name-sorted.fixmate.sorted.dedup.sam O=bams-lab/merged.sorted.dedup.bam
O que eu perdi?
Ele pega apenas um arquivo, porque
$1
é apenas um arquivo .O
*
é interpretado quando você chama seu script, então sua chamadaé emitido como
com
$1
então ser"bams-lab/1.name-sorted.fixmate.sorted.dedup.sam"
.Você deseja usar
"$@"
nofor
loop:ou melhor substituir o loop for por
printf
:ou ainda melhor para o seu caso de uso, adicione aspas e um espaço em vez de nova linha:
Você declarou o script como sendo um script de shell bash, então vou assumir que é isso que você pretende usar. (No entanto, não execute com
sh script
; usebash script
em vez disso. Eles podem ser shells diferentes.)Você pode substituir a
samlist
string por uma matriz de elementos de arquivoTorna-se
E agora você pode usar o array que você criou. Então, em vez disso
Você pode usar isso
Observe que citei todas as variáveis quando as usei. Isso interrompe o shell de tentar processar os itens separados por espaços individuais. Além disso, se o
"{samlist[@]}"
não contém elementos, ele simplesmente desaparece. Dê uma olhada em Por que meu script de shell engasga com espaços em branco ou outros caracteres especiais para obter mais detalhes.