大文件分组求和需求:按列或字符串前缀汇总数值(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

