大文本另类去重多种解法

今天分析数据的时候刚好碰到一个小问题,因为本身文件较大一开始想不出比较好的解决方法,睡个午觉醒来突然有了灵感,自认为目前解决的还算巧妙。

问题

一个 3 列 3,741,430 行的文本(行数比较多),第一列是字符,第二列是字符,第三列是数值,tab 分割。数据格式如下:

A23    B66    1234
C56 D34 2334
B66 A23 1234
D34 C56 2334
E78 F88 1234

这个文本虽然是3,741,430 行,但是其有效信息只有一半。因为A23 B66 1234B66 A23 1234 只是第二列和第一列互换了下位置。

需求

如何尽可能快的处理这个 3 列 3,741,430 行的文本,当某一行的第一列和另一行的第二列相同同时它的第二列又和那一行的第一列相同时,就只保留这两行中的一行即可(具体留哪行没有要求)。简单说就是如下的4行只保留2行:

A23    B66    1234
C56 D34 2334
B66 A23 1234 # 同第一行
D34 C56 2334 # 同第二行

要修改为

A23    B66    1234
D34 C56 2334

小议 linux 并行方法

─=≡Σ(((つ •̀ω•́) つ 车速飚起来,坐稳扶好

前几天朋友圈各种神仙「打架」秀了一波在 R 里分组统计的骚操作,思路总结起来大致是:split-apply-combine。果子还给我直接来了一次需求提速,几个月前需要十几分钟完成的操作如今只要十几秒就拿下了,特别生猛。

在 linux 环境下,不少软件和命令其实也都面临着如何提速的问题。我现在还记得大概一年前 jimmy 问过一个问题:要从一个很大的文本中提取出一批想要的行,如果用 grep -f hewantfile.txt rawdata.txt 来 grep 的话实在是太慢了。当然,这个需要用 R 或者 Python 来做的话,极短时间就可以完成。但如果一定要用 grep 来实现,一种可行的加速方法就是把可拆的元素最大程度拆分,极端的说,就是把 1 个 1 万行的文本拆成 1 万次分析,只运行 1 次。

当然,这些操作都是在你自己一台机器上利用自身多 CPU 特性完成的,如果你能同时操控 1 万台(即使性能很 low 的)机器,那就可以通过 remote 的方式来批量运行,这时「split-apply-combine」的分组思想就近似变成了「MapReduce」的并行思想,而在 linux 也有不少方法可以实现类似这样的效果。

本文所提到的在 linux 中并行主要针对两种需求:一种是只能单线程工作的命令比如 grep 和 sed 以及 bzip2 这类;另一种是一些虽然支持多线程但是并不能充分利用分配线程数的软件,比如 trimmomatic 在实际使用的时候给它 5 个或者 10 个甚至 20 个线程,但每次用到的就是两三个。

并行的使用场景也有两种:多文件和大文件。通常又可以把大文件的场景转换为多文件的场景去解决。

linux 去除文本中的空行

  • sed
  • grep
  • tr
  • awk

awk 入门与进阶 part2—模式动作输出与输入

模式

BEGIN END

当 awk 从输入读取数据之前,首先执行 BEGIN 的语句;当所有输入数据读取完毕,最后执行 END 的语句。BEGIN 与 END 提供控制初始化与结尾的方式。FS 指定输入行分隔符;OFS 指定输出行分隔符。

任意一个表达式都可以作为任意一个运算符的操作数。如果一个表达式是数值形式而运算符要求字符串值,数值会自动转换成字符串;当运算符要求一个数值时字符串会自动转换成数值。

在一个关系比较中,如果两个操作数都是数值,关系比较将会按照数值比较进行;否则的话,数值操作数会被转换成字符串,再将操作数按字符串的形式进行比较。

awk 入门与进阶 part1—快速入门

awk 的结构

由一个单独的模式–动作语句 (pattern-action statement) 组成。

pattern{ action }

awk 的运行方式

awk 的基本操作是在由输入行组成的序列中,陆续地扫描每一行,搜索可以被模式匹配 (match) 的行。每一个输入行轮流被每一个模式测试。每匹配一个模式,对应的动作(可能包含多个步骤) 就会执行。然后下一行被读取,匹配重新开始。这个过程会一起持续到所有的输入被读取完毕为止。

vim 操作应知应会 10 点

  • vim 包括 normal 和 insert 两种模式

    • normal 模式下所有按键都是功能键
    • 在 insert 模式下可以正常的输入内容
  • 进入 vim 后直接定位在某一行或者末尾

    • vim + test.txt 直接进入文本末尾
    • vim +5 test.txt 直接进入文本的第五行

四步实现内网穿透

想要做数据分析,一个配置说的过去的服务器必不可少,在自己的笔记本跑数据总有一些说不出的痛。如果能把实验室配备的高性能服务器搬回宿舍,就可以在宿舍里愉快地工作了。

达成这一愿望一共只需要四步:

  • 下班后趁机潜入机房
  • 拔掉服务器电源,对服务器进行简单拆解
  • 低调地将服务器各零件搬回宿舍
  • 在宿舍对服务器进行组装并调试

以上步骤实施过程中,如果出现意外概不负责!

shell 脚本应知应会

基本介绍

shell 脚本通常是一个以 shebang 起始的文本文件

#!/bin/bash

其中#!位于解释器路径之前。/bin/bash是 Bash 的解释器命令路径。

还有一种常见的写法是#!/bin/bash -ex这里的-e 类似于在第二行写set -e其意义是Exit immediately if a command exits with a non-zero status. ;而-x 的意思是Print commands and their arguments as they are executed.

终端打印

echo

echo 加或者不加单双引号都可以打印 echo 后面的内容,默认情况下 echo 在每次调用后会添加一个换行符。

Linux Command Line 学习笔记 5

说明;写 Linux Command Line 学习笔记 系列文章本意只是记录自己学习 《Linux Command Line 》 这本书的过程中看到的一些自己没有留意到的地方,因此绝大多数内容只是记录了相关知识点而没有实际扩展内容,纯粹是为了自己后期回顾时有迹可循。另外,因为直接看的原版书,所以有些地方中英混杂。更详细地学习建议去阅读原书即可。

Searching For Files 文件查找

linux 倡导所谓的一切皆文件,那我们怎么在系统中查找到自己想要的文件呢。

Linux Command Line 学习笔记4

说明;写 Linux Command Line 学习笔记系列文章本意只是记录自己学习 《Linux Command Line 》 这本书的过程中看到的一些自己没有留意到的地方,因此绝大多数内容只是记录了相关知识点而没有实际扩展内容,纯粹是为了自己后期回顾时有迹可循。另外,因为直接看的原版书,所以有些地方中英混杂。更详细地学习建议去阅读原书即可。

The Environment

  • shell 会话中维护着大量的信息称为环境

  • 查看环境变量
    printenv 或者 printenv USER
    set |less 按照字母顺序显示
    echo $HOME

  • 别名不能用上述方法查看
    alias

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×