2つの代替ファイル拡張子を特定の拡張子に変更するには?

2つの代替ファイル拡張子を特定の拡張子に変更するには?

abc.fq.gz2つの異なるファイル拡張子があり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

おすすめ記事