如何在Bash中从文件路径提取指定格式的文件名片段
提取FastQ文件路径中的样本标识片段
针对你的需求,这里有几个实用的Bash方案,能快速提取出你想要的样本标识片段:
方法1:使用Bash内置参数扩展(推荐)
这种方法不需要依赖外部工具,纯Bash内置实现,处理大量文件时效率更高:
for name in "$FASTQ_DIR"/*/R1/*.fastq.gz; do # 提取文件名(去掉完整路径) filename=$(basename "$name") # 从文件名末尾移除固定后缀 "_R1_001.fastq.gz" sample_id="${filename%_R1_001.fastq.gz}" echo "$sample_id" done
解释:
basename "$name"会去掉文件的完整路径,只保留最后的文件名(比如HISEQ_194_REPEAT_A01_FR_KAPA_25x_1ug_SR_1ngx4rxns_S1_R1_001.fastq.gz)${var%pattern}是Bash的参数扩展语法,会从变量var的末尾删除最短匹配的pattern,这里正好精准移除我们不需要的后缀部分。
方法2:使用sed正则替换
如果你习惯用正则处理字符串,sed是个不错的选择:
for name in "$FASTQ_DIR"/*/R1/*.fastq.gz; do echo "$name" | sed -E 's/.*\/(.*)_R1_001\.fastq\.gz/\1/' done
解释:
-E启用扩展正则表达式,让语法更简洁- 正则
.*\/匹配路径中最后一个/之前的所有内容 (.*)捕获我们需要的样本标识部分_R1_001\.fastq\.gz匹配固定后缀,最后用捕获的内容\1替换整个字符串,得到目标片段。
方法3:使用awk分割处理
awk擅长字段分割,也可以轻松实现这个需求:
for name in "$FASTQ_DIR"/*/R1/*.fastq.gz; do echo "$name" | awk -F '/' '{split($NF, parts, "_R1_001.fastq.gz"); print parts[1]}' done
解释:
-F '/'把输入的路径按/分割成多个字段$NF表示取最后一个字段(也就是文件名)split($NF, parts, "_R1_001.fastq.gz")把文件名用后缀作为分隔符分割成数组parts,第一个元素parts[1]就是我们要的内容。
内容的提问来源于stack exchange,提问作者Ishan Mehta
相关产品推荐
相关产品推荐

