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

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

使用步骤:

  1. 把上面的代码保存为process_status.sh文件
  2. 给脚本添加执行权限:chmod +x process_status.sh
  3. 把脚本和所有的Sample*.txt放在同一个文件夹,运行./process_status.sh
  4. 结果会自动保存到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:09:12