Bash
如何更改具有特定副檔名的兩個替代文件副檔名?
我有兩個不同的文件副檔名
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.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 )
筆記:
- 添加
nullglob
以防止將不匹配的 glob 添加到數組中- 不要
ls
用於填充數組 - 請參閱bash 陷阱 #1然後
$ for i in ${!forward[@]}; do echo "${forward[i]/_1.@(fq|fastq).gz/.sam}"; done foo.sam bar.sam