Bash

如何更改具有特定副檔名的兩個替代文件副檔名?

  • July 14, 2021

我有兩個不同的文件副檔名abc.fq.gzabc.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.gz_2.fastq.gz.sam所以

  • 輸入是abc_1.fq.gz或者abc_1.fastq.gz
  • 並且預期的輸出是abc.sam

我怎樣才能做到這一點?

您不能在 bash 參數擴展中使用大括號擴展,但是您可以使用 KSH 樣式的擴展 glob。前任。

touch foo_1.fq.gz bar_1.fastq.gz

shopt -s nullglob extglob

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

筆記:

  1. 添加nullglob以防止將不匹配的 glob 添加到數組中
  2. 不要ls用於填充數組 - 請參閱bash 陷阱 #1

然後

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

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