使用通配符分配的变量中的参数扩展

使用通配符分配的变量中的参数扩展

我的当前文件夹(MA502)中有两个文件,其名称是 -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.at.fastq

我有很多这样的文件夹 - 例如 MA503、MA504 等,我想循环遍历这些文件夹。

我使用通配符分配变量名称 -

Forward=*R1*.at.fastq
Reverse=*R2*.at.fastq

我想在脚本中处理这些文件,并且希望我的输出替换.at.atqt,以便最终名称看起来像 -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.atqt.fastq

我试过

awk 'script' $Forward > ${Forward/.at/.atqt}

我的最终文件名如下 -

*R1*.atqt.fastq

而不是我的预期

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

我已经学习了unix上的一切,所以我不确定变量名是如何处理的。任何帮助表示赞赏!

答案1

该命令Forward=*R1*.at.fastq将变量设置Forward为字符串*R1*.at.fastq(星号、大写 R、数字 1、星号、点、小写 A 等)。通配符仅在允许多个单词的上下文中扩展;变量赋值的右侧大小需要单个单词,因此不会发生通配符扩展。

在类似 的命令中cat $Forward, 的值中的通配符Forward会被扩展。当变量在双引号外扩展时,其值会被解释为以空格分隔的通配符模式列表,如果任何模式与一个或多个文件匹配,则将其替换为文件列表。

在 中${Forward/.at/.atqt},首先查找变量的值:*R1*.at.fastq。然后将文本替换应用于该字符串,产生*R1*.atqt.fastq。结果是一个不带引号的变量扩展,因此它被解释为通配符模式。但*R1*.atqt.fastq不匹配任何文件,因此保持不变。

要在设置时扩展通配符Forward,可以将其设为数组。

Forward=(*R1*.at.fastq)

这设置Forward为 1 元素数组,元素是 string MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq。通配符模式会扩展到匹配列表,因为它处于需要多个单词的上下文(数组赋值的括号)中。

在 bash 中,$ForwardForwardis 是数组时,相当于${Forward[0]}— 使用与标量变量相同的语法引用数组变量,引用数组的第一个元素。所以你可以保持 awk 命令不变。

相关内容