如何使用for循环合并下划线前前缀匹配的多个fastq文件?
问题描述
目录下有多个fastq文件,需要把下划线前前缀完全匹配的成对文件合并。
输入文件:
SRR9200887_1.fastq SRR9200887_2.fastq SRR9200888_1.fastq SRR9200888_2.fastq SRR9200889_1.fastq SRR9200889_2.fastq
预期输出:
SRR9200887.fastq SRR9200888.fastq SRR9200889.fastq
尝试的代码:
for l in $(ls *.fastq | cut -d_ -f1 | sort |uniq); do cat ${l}*.fastq
正确实现方案
原代码的问题是没把合并结果写入目标文件,而且用ls解析文件名容易在文件名含特殊字符时出错,下面是两种可行的修正方案:
方案一:安全的循环写法
# 先提取所有唯一前缀,再逐个合并 printf "%s\n" *.fastq | cut -d_ -f1 | sort -u | while read base; do cat "${base}_"*.fastq > "${base}.fastq" done
方案二:更简洁的版本
for base in $(printf "%s\n" *.fastq | cut -d_ -f1 | sort -u); do cat "${base}_"*.fastq > "${base}.fastq" done
核心修正说明:
- 增加
> "${base}.fastq"重定向,将合并后的内容写入对应前缀的输出文件 - 用
"${base}_"*.fastq精准匹配前缀对应的成对文件,避免误匹配其他类似命名的文件 - 用
printf "%s\n" *.fastq替代ls,处理文件名更可靠,不会因为空格、特殊字符出问题
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

