如何聚合多文件bash sort结果及大文件拆分后的频率统计结果
嘿,很高兴能帮你解决这两个问题!我会结合你的场景给出实用的解决方案:
问题1:将多个文件的sort结果聚合到单个文件
其实你不需要先单独对每个文件执行sort再合并——sort命令本身就支持直接处理多个输入文件,它会自动完成合并+排序的操作,非常省心:
# 直接合并并排序多个文件 sort file1.txt file2.txt file3.txt > combined_sorted.txt # 如果文件数量多,用通配符更高效 sort *.txt > combined_sorted.txt
如果你已经单独对每个文件完成了排序,那可以用sort -m(merge模式)来快速合并,这个模式会假设输入文件已经是有序的,跳过重新排序的步骤,速度会快很多:
sort -m sorted_file1.txt sorted_file2.txt > combined_sorted.txt
问题2:聚合分片的uniq统计结果
针对你90GB大文件拆分后统计的场景,核心是把各分片里相同行的计数累加起来。这里分两步走,效率和准确性都能兼顾:
步骤1:合并并排序分片统计结果
每个分片的统计文件格式是[计数] [原制表符分隔行],我们需要先把所有统计结果按原行内容排序(让相同的行内容连续出现)。因为每个分片的统计结果本身已经是按原行排序的,所以可以用sort -m快速合并,节省时间:
# 合并所有分片统计文件并按原行内容排序(-b忽略计数后的前导空格) sort -m -b -k2 part_*.txt > merged_sorted_counts.txt
步骤2:用awk累加相同行的计数
接下来用awk遍历排序后的内容,把相同行的计数加起来,生成最终的全局统计:
awk '{ # 提取原行内容(从第二个字段开始到行尾,保留制表符) key = substr($0, index($0, $2)) # 累加计数 total[key] += $1 } END { # 输出最终统计结果 for (k in total) print total[k], k }' merged_sorted_counts.txt > final_counts.txt
如果你想一步到位,不用生成中间文件,可以把两个命令用管道连起来:
sort -m -b -k2 part_*.txt | awk '{ key = substr($0, index($0, $2)) if (key == prev_key) { count += $1 } else { if (prev_key != "") print count, prev_key count = $1 prev_key = key } } END { print count, prev_key }' > final_counts.txt
小提示
-b参数很重要:它会忽略计数字段后的前导空格,确保排序时不会因为空格干扰原行内容的匹配。- 如果原行内容包含特殊字符,这种方法也能正确处理,因为我们是直接提取完整的原行作为匹配键。
内容的提问来源于stack exchange,提问作者Farshad Bakhshandegan Moghadda
相关产品推荐
相关产品推荐

