批量处理VCF文件时,如何提取文件名中间段作为输出文件名?
解决方案
问题分析
你的代码存在两个核心问题:
- 文件名匹配错误:原循环
for i in *_xxxxxx_xxxxxxxxx.vcf仅匹配后缀为固定_xxxxxx_xxxxxxxxx.vcf的文件,但你的实际文件是xxxxxx_可变段_xxxxxx_xxxxxxxxx.vcf,第三个和第四个字段都是可变的,匹配模式不成立。 - 输出文件名生成错误:
${i%??}_edited.vcf只是简单截断文件名最后两个字符,完全没有提取到你需要的中间可变段。
正确实现代码
for i in *_*_*_*.vcf; do # 移除文件后缀 .vcf filename_no_ext="${i%.vcf}" # 按下划线拆分文件名,提取中间的可变段 IFS='_' read -r _ middle_segment _ _ <<< "$filename_no_ext" # 提取以"zzz"开头的行,输出到目标文件 awk '/^zzz/' "$i" > "${middle_segment}.edited_vcf" done
代码说明
- 文件名遍历:
*_*_*_*.vcf确保匹配所有符合四段下划线分隔+.vcf格式的文件。 - 提取中间段:通过
IFS='_'将去掉后缀的文件名按下划线拆分,直接获取第二个字段(即你需要的可变部分)。 - AWK提取逻辑:
/^zzz/是substr($0,1,3)=="zzz"的简洁写法,功能完全一致,用于筛选以zzz开头的行。 - 输出文件命名:直接使用提取到的中间段作为文件名前缀,生成
[中间段].edited_vcf格式的输出文件。
内容的提问来源于stack exchange,提问作者user20330606
相关产品推荐
相关产品推荐

