我有一个包含以下文件内容的文件夹:
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
我尝试使用以下 bash 脚本创建文件列表
#!/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
但它只拾取一个文件
> 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
我错过了什么?
它只拾取一个文件,因为
$1
只是一个文件。当
*
你调用你的脚本时会被解释,所以你的调用发行为
与
$1
然后是"bams-lab/1.name-sorted.fixmate.sorted.dedup.sam"
。您想
"$@"
在for
循环中使用:或者更好地将 for 循环替换为
printf
:甚至更适合您的用例,添加引号和空格而不是换行符:
您已将该脚本声明为 bash shell 脚本,因此我假设您打算使用该脚本。(但不要使用 运行它
sh script
;请改用它bash script
。它们可以是不同的外壳。)您可以将
samlist
字符串替换为文件元素数组变成
现在您可以使用您创建的数组了。所以代替这个
你可以用这个
请注意,当我使用它们时,我已经引用了所有变量。这会阻止 shell 尝试处理单个空格分隔的项目。此外,如果不
"{samlist[@]}"
包含任何元素,它就会消失。请查看为什么我的 shell 脚本会因空格或其他特殊字符而窒息以了解更多详细信息。