Bashでファイルリストを作成できませんでした。

Bashでファイルリストを作成できませんでした。

次のファイルの内容を含むフォルダーがあります。

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 scriptbash 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[@]}"要素が含まれていない場合は消えます。見てシェルスクリプトが空白やその他の特殊文字によって停止するのはなぜですか?詳細については。

関連情報