Unix 입력 파일의 기본 이름을 사용하여 출력을 다른 디렉터리로 보내는 디렉터리를 반복하는 방법

Unix 입력 파일의 기본 이름을 사용하여 출력을 다른 디렉터리로 보내는 디렉터리를 반복하는 방법

저는 UNIX를 자주 사용하지 않는 사용자이고 이것이 일반 사용자에게는 매우 사소한 일이라고 확신하므로 사과드립니다. 다음 코드가 있습니다.

 for file in /home/sub1/samples/aaa*/*_novoalign.bam
      do
           samtools depth -r chr9:218026635-21994999 *_novoalign.bam < $file > /home/sub2/sub3/${file}.out 
      done

입력 폴더와 비슷한 이름을 가진 sub2/sub3/ 파일로 출력을 보내고 싶습니다. "파일이나 디렉터리가 없습니다"라고 뜹니다. 이상적으로는 여기로 보내고 싶습니다. "_novoalign.bam"을 제거하고 "_output.txt"와 같은 새 결말을 추가하세요. 어떤 팁이 있나요?

p.s. 입력 파일이 있는 디렉터리에 쓸 수 있는 권한이 없습니다.

답변1

경로를 제거한 다음 원하지 않는 확장명을 제거해야 합니다.

base=${file##*/}
newfile=${base%_novoalign.bam}_output.txt

그런 다음 다음을 사용하십시오.

... > "/home/sub2/sub3/$newfile"

다른 옵션은 여기에서 Shell Parameter Expansion을 확인하세요.

GNU 배쉬 문서

답변2

cd /home/sub1/samples
for file in aaa*/*_novoalign.bam; do
    target_file="${file%_novoalign.bam}_output.txt"
    samtools depth -r chr9:218026635-21994999 <"$file" >"$target_file"
done

관련 정보