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

大文件分组求和需求:按列或字符串前缀汇总数值(R处理受限)

解决大文件按前缀分组求和的问题

嘿,我太懂用R处理超大文件时内存不够的头疼了!这种文本分组求和的需求,用awk来处理是最省心的——它不用把整个文件塞进内存,逐行处理,效率拉满,完全能应对大体积文件。

先明确你的需求

从你给出的示例来看,核心需求是:

  • 每行是空格分隔的两列:第一列是带下划线的标识字符串,第二列是数值
  • 提取第一列中最后一个下划线_之前的部分作为分组键(比如URS0000001D42-antisense_ATTTCGGTTGGGGAA要提取出URS0000001D42-antisense)
  • 对每个分组对应的第二列数值进行求和汇总

直接能用的awk命令

把下面命令里的your_input_file.txt替换成你的实际文件名就行,如果想把结果保存到文件,就在命令末尾加> your_output_file.txt:

简化版(匹配你的示例场景:第一列仅含一个下划线)

你的示例里第一列只有一个下划线,所以可以用这个简单版本:

awk '{split($1, arr, "_"); sum[arr[1]] += $2} END {for (key in sum) print key, sum[key]}' your_input_file.txt

通用版(兼容第一列含多个下划线的场景)

如果你的第一列里可能有多个下划线(比如类似abc_def_ghi_jkl的格式,需要提取abc_def_ghi作为分组键),就用这个通用命令:

awk '{
    # 把第一列按下划线分割成数组
    n = split($1, arr, "_")
    # 拼接除最后一个元素外的所有部分作为前缀
    prefix = arr[1]
    for (i=2; i<n; i++) {
        prefix = prefix "_" arr[i]
    }
    # 累加对应前缀的数值
    sum[prefix] += $2
} END {
    # 遍历输出所有分组的总和
    for (key in sum) print key, sum[key]
}' your_input_file.txt

用你的示例测试验证

把你给出的示例输入:

URS0000001D42-antisense_ATTTCGGTTGGGGAA 208
URS0000001D42-antisense_CATGCTCATAAGGAA 24
URS0000003804-lncRNA_GAGATCCTGGGTTTT 6
URS0000003CBA-antisense_CTGGGCTAGTGAACGCGGCGAAGT 14
URS0000003F61-antisense_AAAGTGCACTTGGACG 55
URS0000003F61-antisense_AAAGTGCACTTGGACGAA 4

运行简化版命令后,输出完全符合你的预期:

URS0000001D42-antisense 232
URS0000003804-lncRNA 6
URS0000003CBA-antisense 14
URS0000003F61-antisense 59

为啥不推荐继续用R?

R处理文件默认是把整个文件全量加载到内存中,当文件体积过大时很容易出现内存不足的问题。而awk是逐行读取、逐行处理,内存占用极低,几十GB的文件都能轻松搞定,完全适配你的大文件场景。

内容的提问来源于stack exchange,提问作者user2300940

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:08:35