pid1 kid1 pid3 kid1 pid1 kid2 pid1 kid3 pid2 kid3 pid2 kid4
pid1 kid1,kid2,kid3 pid2 kid3,kid4 pid3 kid1
* 原始文本大概有2亿多行php
pid1 kid1 pid1 kid2 pid1 kid3 pid2 kid3 pid2 kid4 pid3 kid3
pid1 kid1,kid2,kid3 pid2 kid3,kid4 pid3 kid1
# sort -k 1 -n src.txt > sort1.txt # cat sort1.txt | php -B ' $pidtmp = 0; $kidtmp = array(); ' -R ' list($pid, $kid) = explode("\t", $argn); if($pid != $pidtmp) { echo "\n".$pidtmp."\t".implode(",", array_keys($kidtmp)); $pidtmp = $pid; $kidtmp = array(); } $kidtmp[$kid] = 1; '
以上两条命令可实现需求,共耗时半个小时左右html
本需求中存在一个原始文档,这个文档是经过其它程序生成的。那么存在一个疑问,为何其它程序生成文档时,不直接生成所须要的格式(即以上示例的最终格式),而是生成一个中间格式的文档。mysql
其实在设计以前的程序时,确实就是指望直接输出以上的最终文档,但出现一个问题就是这个最终文档要怎么存储,存mysql仍是nosql。尝试过mysql,一共有2亿行结果,每一行就须要读、写一次mysql,时间成本过高。而后也尝试了redis,使用列表存储,每一行原数据,只须要写一次redis的列表,能够减小一次读,然而时间仍是太长,因此才将中间结果输入到文本。再使用以上提到的2条命令将结果转换为最终格式,时间成本大下降。redis
若是有另一个程序须要根据pid来搜索以上生成的最终文档,能够借鉴另外一篇文章 ,入口sql