csvtk命令行版极简dplyr

写在前面

什么时候写 csvtk 呀,csvtk 也借鉴了些 datamash 的东西。

之前写 datamash 的使用教程,收到了一位读者的私信,内容如上。

话说这位读者不是别人,正是大名鼎鼎 seqkit 和 csvtk 的开发者 shenwei356 (github ID),江湖人称「爪哥」。我从来没有问过他为什么 ID 有个数字后缀「356」,我私以为是一年 365 天里有 356 天他都在写程序,剩下的几天过年放假。说到爪哥,如果你看到这篇文章之前不知道他我不怪你,但是今天以后希望他可以每天都和你在一起。

爪哥用两个工具就让自己在生物信息领域有了一席之地。其中 seqkit 是用来处理 fasta/q 文本的工具,这篇文章要写的 csvtk 是处理 c/tsv 文本的工具。如果你感觉我的说法夸张了,不妨想想每天接触到的各种文件,无论是 gff 还是 bed 还是 sam 甚至是 vcf,其本质都是 tsv 格式,再加上 seqkit 针对的 fasta 和 fastq。如果你能熟练使用这两个工具,今后的每一天就都会感受到爪哥无微不至的关怀。我经常在敲完一行命令后会在心里大喊一声「爪哥NB」。

linux极简统计分析工具datamash教程

引子

之前写 awk 教程的时候,曾经提到过一些对文本中行列进行某些计算统计的需求,例如使用数组分类求和。一些基本需求 awk 都可以实现,但是写起来稍显复杂。在 R 中使用 dplyr 或者基础函数 aggregate() 可以方便的进行分组操作,如果能在 linux 中使用更加简洁的单行命令针对数值和字符进行一些基本运算就省去了在 R 终端操作的时间。这篇文章介绍一个 linux 中能满足这类需求的工具 GNU datamash

两个使用 awk 的例子如下:

大文本另类去重多种解法

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

问题

一个 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

服务器和 Windows 本地电脑无缝衔接

服务器和 Windows 本地电脑经常需要反复上传下载文件,对于初级用户来说通常会建议其下载类似于 winscp 之类的软件。但是这类高频操作有没有无需借助其它软件更方便的方法呢?

本教程使用前提:

  1. Windows 系统为 win10 且已经可以正常使用 Ubuntu 子系统
  2. 安装有 Xshell 这类可以用来链接服务器的工具
  3. 最好安装有 vs code 本地编辑器
  4. 所有测试是在内网之间进行且本地电脑为网线连接有固定 IP 地址

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 直接进入文本的第五行

四步实现内网穿透

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

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

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

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

Your browser is out-of-date!

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

×