複数のファイルに対して一連のコマンドを実行する

複数のファイルに対して一連のコマンドを実行する

次のファイルがあります。

FC_014_6361.bam
FC_014_6462.bam
FC_014_6183.bam

現在の各ファイルに対して個別に次のコマンドを実行します。たとえば、FC_014_6361.bamコマンドは次のようになります。

$ bedtools intersect -abam FC_014_6361.bam -b CLIA-bed-for-DRAGEN_1.bed > FC_014_6361Inter.bam

$ samtools sort FC_014_6361Inter.bam > FC_014_6361InterSort.bam

$ samtools depth -a FC_014_6361InterSort.bam -b CLIA-bed-for-DRAGEN_1.bed > FC_014_6361InterSortDepth.txt

$ awk '$3<20' FC_014_6361InterSortDepth.txt > 6361_20.txt

このタイプの多くのファイルに対してこれを行うのは非常に退屈です。誰かがこれを自動化して説明するスクリプトを書くのに役立ちますか?

ベストアンサー1

各ソースファイル名を少し変更して、元のファイル名を付けたファイルに結果を保存できます。この情報を使用してループを構築できます。

次の内容をファイルに入れます。doit

#!/bin/bash
#
for bamsrc in "$@"               # For each item on the command line
do
    prefix="${bamsrc%.bam}"      # Strip off trailing .bam
    result="${prefix##*_}"       # Strip off leading *_
    echo "Processing '$bamsrc' into intermediate bam files and ${result}_20.txt"

    # Perform the processing
    bedtools intersect -abam "$bamsrc" -b CLIA-bed-for-DRAGEN_1.bed > "${prefix}Inter.bam"
    samtools sort "${prefix}Inter.bam" >"${prefix}InterSort.bam"
    samtools depth -a "${prefix}InterSort.bam" -b CLIA-bed-for-DRAGEN_1.bed > "${prefix}InterSortDepth.txt"
    awk '$3<20' "${prefix}InterSortDepth.txt" > "${result}_20.txt"
done

スクリプトファイルを実行可能にします。

chmod a+x doit

次に、ソースファイル名をスペースで区切られたリストとして使用します。

./doit FC_014_6361.bam FC_014_6462.bam FC_014_6183.bam

おすすめ記事