You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:53:09