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


8

我的当前文件夹(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上学到了所有东西,所以我不确定如何处理变量名。任何帮助表示赞赏!

Answers:


13

该命令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中,$Forwardwhen Forward是一个数组等效于${Forward[0]}—用与标量变量相同的语法引用一个数组变量是指该数组的第一个元素。因此,您可以保持awk命令不变。


该脚本有效,您的解释对我来说很容易。非常感谢!
Ayush Saxena
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.