文本处理的小诀窍

场景描述

  • 原始文本格式:

        pid1 kid1
        pid3 kid1
        pid1 kid2
        pid1 kid3
        pid2 kid3
        pid2 kid4
  • 需要统计的结果:每条pid可以跟哪几个kid关联,最终结果格式:

        pid1 kid1,kid2,kid3
        pid2 kid3,kid4
        pid3 kid1

* 原始文本大概有2亿多行

处理思路

  • 将文本按第一列排序,排序后效果:

    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;
      ‘

以上两条命令可实现需求,共耗时半个小时左右

其它说明

本需求中存在一个原始文档,这个文档是通过其它程序生成的。那么存在一个疑问,为什么其它程序生成文档时,不直接生成所需要的格式(即以上示例的最终格式),而是生成一个中间格式的文档。

其实在设计之前的程序时,确实就是期望直接输出以上的最终文档,但出现一个问题就是这个最终文档要怎么存储,存mysql还是nosql。尝试过mysql,一共有2亿行结果,每一行就需要读、写一次mysql,时间成本太高。然后也尝试了redis,使用列表存储,每一行原数据,只需要写一次redis的列表,可以减少一次读,然而时间还是太长,所以才将中间结果输入到文本。再使用以上提到的2条命令将结果转换为最终格式,时间成本大降低。

如果有另外一个程序需要根据pid来搜索以上生成的最终文档,可以借鉴另一篇文章 ,入口

时间: 2024-08-15 12:42:43

文本处理的小诀窍的相关文章

SPComm的一点小诀窍 spcomm的问题导致数据丢失 0x11与0x13错误

最近几天完成了BiasDAC的程序编写.调试的过程还算比较顺利,除了几个有点bt的小问题.其中一个困扰了我两三天的时间,今天上午终于将其解决. 由于BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了Delphi的SPComm控件.在之前的使用中,SPComm控件一直工作正常,使用的是一般的string进行消息的传递. 而BiasDAC由于通信协议的限制,消息的发送使用的是hex方式,会用到从0x00到0xFF所有的这些字符.在调试中发现,发送0x11和0x13之后

c/c++ 继承与多态 文本查询的小例子(非智能指针版本)

问题:在上一篇继承与多态 文本查询的小例子(智能指针版本)在Query类里使用的是智能指针,只把智能指针换成普通的指针,并不添加拷贝构造方法,会发生什么呢? 执行时,代码崩掉. 分析下面一行代码: Query qb = ~Query("Alice"); 1,首先调用Query(string)的构造函数,把Query的成员q指向了new WordQuery(s) Query::Query(const std::string& s) : q(new WordQuery(s)){ s

iOS开发>学无止境 - 6个iOS图片文本设计的小技巧

英文:TOPE 作者:星夜暮晨 网址:http://www.jianshu.com/p/88263196fdf0 设计师们似乎拥有着我们这些开发者所没有的“魔力”,他们知道如何让一个应用的界面看起来非常得舒适,以至于有时让我们有了迫不及待将其复现的冲动. 然而,几天过去了,我们仍然还停留在设计稿的第一个界面,写下大段大段的代码,可是界面却不是我们想要的那个样子,这无疑是非常让人恼火的一件事情. 好消息是设计师们的“魔力”并不是我们想象中的那么神奇,有一些关于设计的小技巧.只要掌握了它们,我们就能

浅谈angularjs绑定富文本出现的小问题

富文本编辑器上传的文本和图片以及样式,一般都会以html代码的形式上传到服务器,当再次从服务器请求这些数据,回显到页面的时候,用jq绑定数据或者el表达式一般情况下都是没问题的,当使用angular前端架构绑定数据的时候,有时会出现把所有标签都带懂了前台页面. 解决方法很简单如果用的是ng-bind="any"或者是{{any}}的话,只需要把绑定方式替换成ng-bind-html="any",这样绑定的数据就会以html的形式解析在页面上,完美解决上述问题.

[Android]为TextView提供双色文本配置的小工具ColorPhrase

本文链接http://blog.csdn.net/jan_s/article/details/51338944,转载请留言. 在安卓开发过程中,经常会看到文本中有重点的字段是需要换色的,为了表现其特殊性.这个时候大多数人都会用比较简单的方式就是再New 一个TextView出来,显然很快速,然而这样做无疑是给布局绘制添加麻烦,这里简单提供一个工具ColorPhrase类,帮你解决这一的麻烦. 先看demo效果图 . 使用方式: 1.MainActivity.java public class M

处理文本的一些小的技巧

grep 精准过滤 如果是有进程名为abcd,abcde等有包含"abc"字符的,那么判断将会不准备,如果精确的匹配到abc呢,当时不知道,只能很诚实的回答,不清楚 其实答案很简单,用grep –w "abc" 或者是grep "\<abc\>"都可以实现 -w, --word-regexp         强制 PATTERN 仅完全匹配字词 假设文本中的内容为: aaaa bbbb ccccc dddd 要求将文本内容处理为: a

FIS 配置小诀窍

之前用 FIS 的时候,发现配置 roadmap 的时候出现了非常诡异的现象:命令行使用 -o 参数,配置文件里对 html 不使用优化,导致 uglify 了 js 文件后,不会修改 html 中对 js 的引用,依旧引用以前的 js,没有引用 uglify 后改变了 MD5 的js. 尝试修改了无数次,反复验证实验,最小化项目代码后重新跑,结果还是一样.百思不得其解,然后联系了 FIS 的开发人员,才了解到,FIS 内置了一些逻辑,如果使用 fis.config.merge 会造成一些诡异的

一个文本处理的小练习:

1.有如下一组数据,经处理,希望得到每行60个碱基,每十个碱基一组. 1.将上述数据复制到编辑器,利用列模式,删除数字.保存为fa格式的文件 2.删除碱基间的空格并将小写变为大写: seqkit seq  11.fa  -g -u  >  12.fa 3.指定每行输出的碱基数 seqkit  seq  12.fa  -s  -w  60  -o   13.fa 4.将每行60个碱基分为10个碱基一组,中间以空格隔开 5.然后就是在每行的行尾添加数字,暂时忘记咋做了.

对于多个按钮要在同一个监听器中实现自己的单击事件的方法小诀窍。

在网上的一些教程中往往是把一个按钮添加多个监听器,却很少有人会把多个按钮在同一个监听器中去实现他们的单击事件,而且这杨的其实是很实用的,比如说在制作一个简单的计算器是就需要0-9,这十个数字按钮如果要单独的去写这十个按钮的单击事件,那可以想象这样写出来的代码绝对是不够健壮的,这样的程序也是会影响其运行速度的.这样的程序如果是在java中是很容易实现的,但是在android中要涉及的知识还是很多的,接下来先看看主要的代码: //////////////使用窗口作为监听器. public class