두 개의 대체 파일 확장자를 특정 확장자로 변경하는 방법은 무엇입니까?

두 개의 대체 파일 확장자를 특정 확장자로 변경하는 방법은 무엇입니까?

abc.fq.gz두 개의 다른 파일 확장자 가 있는데 abc.fastq.gz이를 abc.sam.

나는 이것을 시도했습니다 :

#!/bin/bash
refdir="Homo_sapiens.GRCh38.dna_sm.primary_assembly"
forward=(*_1.{fq,fastq}.gz)
reverse=(*_2.{fq,fastq}.gz)

for i in "${!forward[@]}"
do
  echo ${forward[i]//_1.{fq,fastq}.gz/.sam}>> a.txt
done

하지만 이 {fq,fastq}부분은 작동하지 않습니다. 위에서 볼 수 있듯이 _1.fq.gzor 를 _2.fastq.gz로 바꿔야 .sam하므로

  • 입력은 abc_1.fq.gz또는abc_1.fastq.gz
  • 예상 출력은 다음과 같습니다.abc.sam

어떻게 해야 하나요?

답변1

Bash 매개변수 확장에는 중괄호 확장을 사용할 수 없지만 KSH 스타일 확장 글로브는 사용할 수 있습니다. 전임자.

touch foo_1.fq.gz bar_1.fastq.gz

shopt -s nullglob extglob

forward=( *_1.{fq,fastq}.gz )

노트:

  1. nullglob일치하지 않는 glob이 배열에 추가되는 것을 방지하려면 추가하세요.

  2. 배열을 채우는 데 사용하지 마십시오 ls. 참조배쉬 트랩 #1

그 다음에

$ for i in ${!forward[@]}; do echo "${forward[i]/_1.@(fq|fastq).gz/.sam}"; done
foo.sam
bar.sam

관련 정보