csvtk | 命令行下表格统计分析、数据筛选、替换、整理神器

如同生物信息领域中的FASTA/Q格式一样,CSV/TSV作为计算机、数据科学和生物信息的基本格式,应用非常广泛。常用的处理软件包括:

  • 以微软Excel为代表的电子表格软件
  • Notepad++/SublimeText等文本编辑器
  • sed/awk/cut等Shell命令
  • 各种编程语言的数据处理库。

然而,电子表格软件和文本编辑器固然强大,但依赖鼠标操作,不适合批量处理;sed/awk/cut等Shell命令主要用于通用的表格数据,不适合含有标题行的CSV格式;为了一个小操作写Python/R脚本也有点小题大作,且难以复用。开发csvtk前现有的工具主要是Python写的csvkit,Rust写的xsv,C语言写的miller,都各有优劣。作者沈伟之前刚开发完seqkit,投文章过程中时间充足,便想趁热再造一个轮子。所以决定写一个命令行工具来满足CSV/TSV格式的常见操作,这就是csvtk了。

一、安装

支持Windows/Mac/Linux的32和64位系统。用户根据自己的系统自取。

最新版发布页面:https://github.com/shenwei356/csvtk/releases

Linux 64位Ubuntu为例

# 下载,大小为7.46M
wget https://github.com/shenwei356/csvtk/releases/download/v0.19.1/csvtk_linux_amd64.tar.gz
# 解压后为16M
tar xvzf csvtk_linux_amd64.tar.gz
# 添加环境变量自己用,Ubuntu默认~/bin为环境变量
mkdir -p $HOME/bin/; cp csvtk $HOME/bin/
# 添加系统变量给所有人用 (可选)
sudo cp csvtk /usr/local/bin/

# Conda安装(依赖关系检查可能要好久)
conda install -c bioconda csvtk

二、介绍

1.基本信息

  • 工具类型: 命令行工具,子命令结构
  • 支持格式: CSV/TSV, plain/gzip-compressed
  • 编程语言: Go
  • 支持平台: Linux, OS X, Windows 等
  • 发布方式: 单一可执行二进制文件,下载即用
  • 发布平台: Github, Bioconda
  • 项目主页: http://bioinf.shenwei.me/csvtk/
  • 开源地址: https://github.com/shenwei356/csvtk

2.特性

  • 跨平台
  • 轻量,无任何依赖,无需编译、配置,下载即用
  • 快速
  • 支持stdin和gzip压缩的输入和输出文件,便于流处理
  • 27个子命令提供多种实用的功能,且能通过命令行管道组合
  • 支持Bash自动补全
  • 支持简单的绘图

3.功能

到目前为止,csvtk已有27个子命令,分为以下几大类:
信息

  • headers 直观打印标题行(操作列数较多的CSV前使用最佳)
  • stats 基本统计
  • stats2 对选定的数值列进行基本统计

格式转化

  • pretty 转为美观、可读性强的格式(最常用命令之一)
  • csv2tab 转CSV为制表符分割格式(TSV)
  • tab2csv 转TSV为CSV
  • space2tab 转空格分割格式为TSV
  • transpose 转置CSV/TSV
  • csv2md 转CSV/TSV为makrdown格式(写文档常用)

集合操作

  • head 打印前N条记录
  • sample 按比例随机采样
  • cut 选择特定列,支持按列或列名进行基本选择、范围选择、模糊选择、负向选择(最常用命令之一,非常强大)
  • uniq 无须排序,返回按指定(多)列作为key的唯一记录(好绕。。)
  • freq 按指定(多)列进行计数(常用)
  • inter 多个文件间的交集
  • grep 指定(多)列为Key进行搜索(最常用命令之一,可按指定列搜索)
  • filter 按指定(多)列的数值进行过滤
  • filter2 用类似awk的数值/表达式,按指定(多)列的数值进行滤
  • join 合并多个文件(常用)

编辑

  • rename 直接重命名指定(多)列名(简单而实用)
  • rename2 以正则表达式重命名指定(多)列名(简单而实用)
  • `replace 以正则表达式对指定(多)列进行替换编辑(最常用命令之一,可按指定列编辑)
  • mutate 以正则表达式基于已有列创建新的一列(常用于生成多列测试数据)
  • mutate2 用类似awk的数值/表达式,以正则表达式基于已有(多)列创建新的一列(常用)
  • gather 类似于R里面tidyr包的gather方法
    排序
    sort 按指定(多)列进行排序
    绘图
    plot 基本绘图
    plot hist histogram
    plot box boxplot
    plot line line plot and scatter plot

其它
version 版本信息和检查新版本
genautocomplete 生成支持Bash自动补全的配置文件,重启Terminal生效。

4.使用

  • 输入数据要求每行的列数一致,空行也会报错
  • csvtk默认输入数据含有标题行,如没有请开启全局参数-H
  • csvtk默认输入数据为CSV格式,如为TSV请开启全局参数-t
  • 输入数据列名最好唯一无重复
  • 如果TSV中存在双引号"",请开启全局参数-l
  • csvtk默认以#开始的为注释行,若标题行含#,请给全局参数-C指定另一个不常见的字符(如$)

三、例子

仅提供少量例子,更多例子请看使用手册http://bioinf.shenwei.me/csvtk/usage/

源代码:https://github.com/shenwei356/csvtk/

下载软件和测序数据

git clone git@github.com:shenwei356/csvtk.git
cd csvtk/testdata/ 

注意:

有些测序数据可能不在testdata中,可以自行根据下面页面显示内容保存;
软件默认为csv,使用-t参数改为tsv
命令后面可接输入文件,作者用cat inputfile 格式使命令中无输入文件,从 | 管道符读取数据,代码阅读更清楚

  1. 示例数据
 # 查看一个逗号分隔的名单示例文件
 $ cat names.csv
 id,first_name,last_name,username
 11,"Rob","Pike",rob
 2,Ken,Thompson,ken
 4,"Robert","Griesemer","gri"
 1,"Robert","Thompson","abc"
 NA,"Robert","Abel","123"
  1. 增强可读性
 # 格式化结果按列对齐,补空格
 $ cat names.csv  | csvtk pretty
 id   first_name   last_name   username
 11   Rob          Pike        rob
 2    Ken          Thompson    ken
 4    Robert       Griesemer   gri
 1    Robert       Thompson    abc
 NA   Robert       Abel        123

3.转为markdown,写博客、公众号超级有用

 $ cat names.csv | csvtk csv2md
 id |first_name|last_name|username
 :--|:---------|:--------|:-------
 11 |Rob       |Pike     |rob
 2  |Ken       |Thompson |ken
 4  |Robert    |Griesemer|gri
 1  |Robert    |Thompson |abc
 NA |Robert    |Abel     |123

效果

4.用列位置或列名来选择指定列,可改变列的顺序

 # 按列位置选择并可设置顺序
 $ cat names.csv | csvtk cut -f 3,1 | csvtk pretty
 # 按列名选择并可重排序列
 $ cat names.csv | csvtk cut -f last_name,id | csvtk pretty
 last_name   id
 Pike        11
 Thompson    2
 Griesemer   4
 Thompson    1
 Abel        NA

5.用通配符选择多列

 # 匹配内容可不可引号,有引号阅读更方便
 # *代表包括任意,多选择可用逗号,并行
 $ cat names.csv | csvtk cut -F -f '*name,id' | csvtk pretty
 first_name   last_name   username   id
 Rob          Pike        rob        11
 Ken          Thompson    ken        2
 Robert       Griesemer   gri        4
 Robert       Thompson    abc        1
 Robert       Abel        123        NA

6.删除第2,3列(下列第二种方法是选定范围,但-3在前,-2在后)

 # 指定列号
 $ cat names.csv | csvtk cut -f -2,-3 | csvtk pretty
 # 指定列范围
 $ cat names.csv | csvtk cut -f -3--2 | csvtk pretty
 # 指定列名
 $ cat names.csv | csvtk cut -f -first_name,-last_name | csvtk pretty
 id   username
 11   rob
 2    ken
 4    gri
 1    abc
 NA   123

7.按指定列搜索,默认精确匹配

 # -f指定id列,-p指定模式,默认匹配单元格,匹配1,不会匹配11。模糊可用通配符
 $ cat names.csv | csvtk grep -f id -p 1 | csvtk pretty
 id   first_name   last_name   username
 1    Robert       Thompson    abc

8.模糊搜索(正则表达式)

 # -r开启模糊匹配,只要包含即可
 $ cat names.csv | csvtk grep -f id -p 1 -r | csvtk pretty
 id   first_name   last_name   username
 11   Rob          Pike        rob
 1    Robert       Thompson    abc

9.用文件作为模式来源

 # 经常需要配置多个值,按列表数据筛选很方便
 $ cat names.csv | csvtk grep -f id -P id-files.txt

10.对指定列做简单替换

 # 支持正则的替换,匹配内容保存为$1,再修饰
 $ cat names.csv | csvtk replace -f id -p '(\d+)' -r 'ID: $1' | csvtk pretty
 id       first_name   last_name   username
 ID: 11   Rob          Pike        rob
 ID: 2    Ken          Thompson    ken
 ID: 4    Robert       Griesemer   gri
 ID: 1    Robert       Thompson    abc
 NA       Robert       Abel        123

11.用key-value文件来替换(seqkit和brename都支持类似操作)

 # 指定列表的替换
 $ cat data.tsv
 name    id
 A       ID001
 B       ID002
 C       ID004

 $ cat alias.tsv
 001     Tom
 002     Bob
 003     Jim

 # nr代表行号,kv代表将匹配的$1替换为-k文件中第2列
 $ csvtk replace -t -f 2 -p "ID(.+)" -r "N: {nr}, alias: {kv}" -k alias.tsv data.tsv
 name    id
 A       N: 1, alias: Tom
 B       N: 2, alias: Bob
 C       N: 3, alias: 004

12.合并表格,需要分别指定各文件中的key列:默认均为第一列;若列(名)相同提供一个;若不同用分号分割

 $ cat phones.csv
 username,phone
 gri,11111
 rob,12345
 ken,22222
 shenwei,999999

 # 按名合并,包括不匹配的值
 $ csvtk join -f 'username;username' --keep-unmatched names.csv phones.csv | csvtk pretty
 id   first_name   last_name   username   phone
 11   Rob          Pike        rob        12345
 2    Ken          Thompson    ken        22222
 4    Robert       Griesemer   gri        11111
 1    Robert       Thompson    abc
 NA   Robert       Abel        123

以上的内容是否能加速你的分析工作。

内容主要来自csvkt官方中文介绍 https://bioinf.shenwei.me/csvtk/chinese/。有改动,内容有增加

扩展阅读:
Usage and Examples https://bioinf.shenwei.me/csvtk/usage/
英文使用和示例,每个命令的使用实例

Tutorial https://bioinf.shenwei.me/csvtk/tutorial/ 具体应用教程,以OTU表为例

https://blog.csdn.net/woodcorpse/article/details/104683075

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容