次のファイルの内容を含むフォルダーがあります。
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
ただし、ファイルは1つだけ選択されます。
> 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つのファイルだけを選択するからです。$1
ただファイル。
*
スクリプトを呼び出すと解釈されるので、呼び出し
sh merge_sam_pbs.sh bams-lab/*.name-sorted.fixmate.sorted.dedup.sam
次のように発行
sh merge_sam_pbs.sh "bams-lab/1.name-sorted.fixmate.sorted.dedup.sam" "bams-lab/2.name-sorted.fixmate.sorted.dedup.sam" "bams-lab/3.name-sorted.fixmate.sorted.dedup.sam"
その時$1
です"bams-lab/1.name-sorted.fixmate.sorted.dedup.sam"
。
"$@"
ループで使用したいですfor
。
samlist=$(for sam in "$@"; do echo "I=$sam "; done)
または、forループを次に置き換える方が良いですprintf
。
samlist=$(printf 'I=%s\n' "$@")
または、ユースケースに適した改行の代わりに引用符とスペースを追加します。
samlist=$(printf 'I="%s" ' "$@")
答え2
スクリプトをbashシェルスクリプトとして宣言したので、それを使用したいとします。 (しかし、実行しないでくださいsh script
。bash script
代わりにを使用してください。他のシェルかもしれません。)
samlist
文字列をファイル要素の配列に置き換えることができます
#!/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)
~になる
#!/bin/bash
# usage: bash merge_sam_pbs.sh /path/to/*.name-sorted.fixmate.sorted.dedup.sam
# Create output directory based on first filename passed to the script
output="${1%/*}"
# For all the filenames passed to the script, prefix with 'I=', and add to array
samlist=()
for sam in "$@"
do
samlist+=("I=$sam")
done
これで作成した配列を使用できます。だからこれではなく
picard -Xmx10g MergeSamFiles \ $samlist \ O=${output}/merged.sorted.dedup.bam
あなたはこれを使うことができます
picard -Xmx10g MergeSamFiles "${samlist[@]}" O="$output/merged.sorted.dedup.bam"
変数を使用するときは、すべての変数を引用します。これにより、シェルがスペースで区切られた個々の項目を処理しようとするのを防ぎます。また、"{samlist[@]}"
要素が含まれていない場合は消えます。見てシェルスクリプトが空白やその他の特殊文字によって停止するのはなぜですか?詳細については。