Bash

對多個文件執行一系列命令

  • January 25, 2021

我有以下文件:

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

對這種類型的許多文件執行此操作很乏味。有人可以幫助編寫一個可以自動執行此操作並對其進行解釋的腳本嗎?

對於每個源文件名,您稍作修改並將結果保存在以原始文件命名的文件中。使用這些資訊,我們可以建構一個循環。

將以下內容放入文件中,例如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

引用自:https://unix.stackexchange.com/questions/630924