여러 파일에 대해 일련의 명령 실행

여러 파일에 대해 일련의 명령 실행

다음 파일이 있습니다.

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

답변2

먼저 여기입니다. 아직 테스트하지는 않았지만 솔루션을 만드는 데 도움이 될 수 있습니다.

#!/bin/bash
for filename in *.bam;do
    number=$( echo $filename | grep -o '[0-9]\+' )
    bedtools intersect -abam $filename -b CLIA-bed-for-DRAGEN_1.bed > "$filename"Inter.bam
    samtools sort "$filename"Inter.bam > "$filename"InterSort.bam
    samtools depth -a "$filename"InterSort.bam -b CLIA-bed-for-DRAGEN_1.bed > "$filename"InterSortDepth.txt
    awk '$3<20' "$filename"InterSortDepth.txt > "$number"_20.txt
done

관련 정보