我的当前文件夹(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 中,$Forward
当Forward
is 是数组时,相当于${Forward[0]}
— 使用与标量变量相同的语法引用数组变量,引用数组的第一个元素。所以你可以保持 awk 命令不变。