Bash脚本匹配文件前缀迁移指定字段无输出问题排查
解决Bash脚本无输出问题:合并Oncomine文件指定列
首先咱们来拆解下你现有脚本没输出的核心原因:你的awk逻辑是用file1的第5、6、7列作为键存储整行,再试图匹配file2的第一列,但file2的第一列是Controls:,和file1里的Total_Targets或2353完全不匹配,自然找不到对应项,所以没有任何输出。
接下来是针对性的修正方案,我们需要实现:
- 从file1中提取指定列的表头和数据
- 把这些内容插入到file2开头,加上
Quality metrics:标题 - 支持通过文件前缀批量匹配处理(毕竟你要处理的是一组前缀相同的文件)
单文件处理的修正脚本
针对单个前缀(比如123_Last-First),可以用这个awk命令:
prefix="123_Last-First" file1="/home/cmccabe/oncomine/250x/${prefix}_250x.txt" file2="/home/cmccabe/oncomine/report/${prefix}_oca.txt" output="/home/cmccabe/oncomine/report/final/${prefix}_oncomine.txt" awk ' # 处理第一个文件(file1) FNR==NR { if (FNR == 1) { # 提取表头的第5-7列 header = $5 "\t" $6 "\t" $7 } else { # 提取数据行的第5-7列 data = $5 "\t" $6 "\t" $7 } next } # 处理第二个文件(file2) BEGIN { print "Quality metrics:" print header print data } { print } ' "$file1" "$file2" > "$output"
批量处理所有前缀匹配的文件
如果你有多个前缀的文件需要处理,可以用循环遍历250x目录下的文件,自动匹配对应report目录的文件:
# 先创建输出目录(如果不存在) mkdir -p /home/cmccabe/oncomine/report/final # 遍历250x目录下所有_250x.txt后缀的文件 for file1 in /home/cmccabe/oncomine/250x/*_250x.txt; do # 提取文件前缀:去掉末尾的_250x.txt prefix=$(basename "$file1" _250x.txt) # 对应report目录下的oca文件路径 file2="/home/cmccabe/oncomine/report/${prefix}_oca.txt" # 最终输出文件路径 output="/home/cmccabe/oncomine/report/final/${prefix}_oncomine.txt" # 先检查对应file2是否存在,避免报错 if [ -f "$file2" ]; then awk ' FNR==NR { if (FNR == 1) { header = $5 "\t" $6 "\t" $7 } else { data = $5 "\t" $6 "\t" $7 } next } BEGIN { print "Quality metrics:" print header print data } { print } ' "$file1" "$file2" > "$output" echo "处理完成:$output" else echo "警告:未找到对应文件 $file2" fi done
验证输出效果
运行脚本后,你会得到完全符合预期的输出文件,比如123_Last-First_oncomine.txt:
Quality metrics:
Total_Targets Targets_less_than250x Percent_more_than250x
2353 1 99.9575
Controls: 4 expression controls detected
内容的提问来源于stack exchange,提问作者justaguy
相关产品推荐
相关产品推荐

