Linux下如何从多个文件提取指定信息并生成表格?
批量处理状态文件生成汇总表格方案
这里有几个实用的方法帮你一次性处理所有状态文本文件,生成你需要的汇总表格,我会详细说明每个方案的用法:
方案一:用awk脚本(推荐,灵活高效)
awk非常适合处理这种键值对格式的文本,还能轻松实现多文件数据汇总。你可以直接用下面的脚本:
#!/bin/bash # 定义需要提取的字段,按你想要的输出顺序排列 TARGET_FIELDS=( "Assigned" "Unassigned_Unmapped" "Unassigned_MultiMapping" "Unassigned_NoFeatures" "Unassigned_Ambiguity" ) # 核心awk处理逻辑 awk -v target_fields="${TARGET_FIELDS[*]}" ' BEGIN { # 把目标字段转换成数组,记录顺序 split(target_fields, field_list, " ") for (idx in field_list) { field_pos[field_list[idx]] = idx } } # 处理每个新文件时提取样本名 FILENAME != prev_file { # 从文件名提取样本名(比如Sample1.txt → Sample1) split(FILENAME, name_parts, ".") current_sample = name_parts[1] samples[++total_samples] = current_sample prev_file = FILENAME } # 如果当前行是目标字段,就存储对应值 $1 in field_pos { result[$1][current_sample] = $2 } END { # 输出表头:开头空一格,后跟所有样本名 printf " " for (i=1; i<=total_samples; i++) { printf "%s ", samples[i] } print "" # 按预设顺序输出每个字段的所有样本数据 for (i=1; i<=length(field_list); i++) { field_name = field_list[i] printf "%s ", field_name for (j=1; j<=total_samples; j++) { printf "%s ", result[field_name][samples[j]] } print "" } }' *.txt > summary_table.txt
使用步骤:
- 把上面的代码保存为
process_status.sh文件 - 给脚本添加执行权限:
chmod +x process_status.sh - 把脚本和所有的
Sample*.txt放在同一个文件夹,运行./process_status.sh - 结果会自动保存到
summary_table.txt里,格式完全符合你的要求
自定义说明:
如果你的样本名需要从Status行的路径中提取(比如文件名和路径里的样本名不一致),可以把脚本里提取样本名的部分替换成下面的代码:
/^Status/ { # 从路径/documents/Sample1.sorted.bam中提取Sample1 split($2, path_segments, "/") file_fullname = path_segments[length(path_segments)] split(file_fullname, name_parts, ".") current_sample = name_parts[1] }
方案二:用基础命令组合(易理解,适合新手)
如果你更习惯用grep、cut、paste这些基础命令,可以用下面的步骤:
# 第一步:为每个文件提取目标字段,生成临时文件 for status_file in *.txt; do sample_name=$(basename "$status_file" .txt) grep -E "Assigned|Unassigned_Unmapped|Unassigned_MultiMapping|Unassigned_NoFeatures|Unassigned_Ambiguity" "$status_file" > "${sample_name}_temp.txt" done # 第二步:提取字段名作为表格第一列 cut -d' ' -f1 Sample1_temp.txt > fields_list.txt # 第三步:提取每个样本的数值列 for temp_file in *_temp.txt; do sample_name=$(basename "$temp_file" _temp.txt) cut -d' ' -f2 "$temp_file" > "${sample_name}_values.txt" done # 第四步:组合成最终表格 # 先写表头 printf " " > summary_table.txt ls *_values.txt | sed 's/_values.txt//' | tr '\n' ' ' >> summary_table.txt echo "" >> summary_table.txt # 合并字段列和所有数值列 paste fields_list.txt *_values.txt | tr '\t' ' ' >> summary_table.txt # 清理临时文件 rm -f *_temp.txt *_values.txt fields_list.txt
这个方法的好处是每一步都很直观,缺点是需要生成临时文件,样本数量多的时候合并步骤需要调整。
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

