如何将两个替代文件扩展名更改为特定扩展名?

如何将两个替代文件扩展名更改为特定扩展名?

我有两个不同的文件扩展名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

我怎样才能做到这一点?

答案1

您不能在 bash 参数扩展中使用大括号扩展,但可以使用 KSH 样式的扩展 glob。前任。

touch foo_1.fq.gz bar_1.fastq.gz

shopt -s nullglob extglob

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

笔记:

  1. addnullglob以防止将不匹配的 glob 添加到数组中

  2. 不要用于ls填充数组 - 请参阅bash 陷阱 #1

然后

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

相关内容