内容主要来自csvkt官方中文介绍 https://bioinf.shenwei.me/csvtk/chinese/。有改动,内容有增加
如同生物信息领域中的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
Windows 64位版
https://github.com/shenwei356/csvtk/releases/download/v0.19.1/csvtk_windows_amd64.exe.tar.gz
Mac 64位版 https://github.com/shenwei356/csvtk/releases/download/v0.19.1/csvtk_darwin_amd64.tar.gz
介绍
基本信息
- 工具类型: 命令行工具,子命令结构
- 支持格式: CSV/TSV, plain/gzip-compressed
- 编程语言: Go
- 支持平台: Linux, OS X, Windows 等
- 发布方式: 单一可执行二进制文件,下载即用
- 发布平台: Github, Bioconda
- 项目主页: http://bioinf.shenwei.me/csvtk/
- 开源地址: https://github.com/shenwei356/csvtk
特性
- 跨平台
- 轻量,无任何依赖,无需编译、配置,下载即用
- 快速
- 支持stdin和gzip压缩的输入和输出文件,便于流处理
- 27个子命令提供多种实用的功能,且能通过命令行管道组合
- 支持Bash自动补全
- 支持简单的绘图
功能
在开发csvtk之前的两三年间,我已经写了几个可以复用的Python/Perl脚本(https://github.com/shenwei356/datakit) ,包括csv2tab、csvtk_grep、csv_join、csv_melt,intersection,unique。所以我的计划是首先集成这些已有的功能,随后根据需求进行扩展。
到目前为止,csvtk已有27个子命令,分为以下几大类:
- 信息
headers
直观打印标题行(操作列数较多的CSV前使用最佳)stats
基本统计stats2
对选定的数值列进行基本统计
- 格式转化
pretty
转为美观、可读性强的格式(最常用命令之一)csv2tab
转CSV为制表符分割格式(TSV)tab2csv
转TSV为CSVspace2tab
转空格分割格式为TSVtranspose
转置CSV/TSVcsv2md
转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
histogramplot box
boxplotplot line
line plot and scatter plot
- 其它
version
版本信息和检查新版本genautocomplete
生成支持Bash自动补全的配置文件,重启Terminal生效。
使用
- 输入数据要求每行的列数一致,空行也会报错
- 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 格式使命令中无输入文件,从 | 管道符读取数据,代码阅读更清楚
-
示例数据
# 查看一个逗号分隔的名单示例文件 $ 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"
-
增强可读性
# 格式化结果按列对齐,补空格 $ 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
-
转为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
效果
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 -
用列位置或列名来选择指定列,可改变列的顺序
# 按列位置选择并可设置顺序 $ 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
-
用通配符选择多列
# 匹配内容可不可引号,有引号阅读更方便 # *代表包括任意,多选择可用逗号,并行 $ 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
-
删除第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
-
按指定列搜索,默认精确匹配
# -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
-
模糊搜索(正则表达式)
# -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
-
用文件作为模式来源
# 经常需要配置多个值,按列表数据筛选很方便 $ cat names.csv | csvtk grep -f id -P id-files.txt
-
对指定列做简单替换
# 支持正则的替换,匹配内容保存为$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
-
用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
-
合并表格,需要分别指定各文件中的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
以上的内容是否能加速你的分析工作。
扩展阅读:
Usage and Examples https://bioinf.shenwei.me/csvtk/usage/
英文使用和示例,每个命令的使用实例
Tutorial https://bioinf.shenwei.me/csvtk/tutorial/ 具体应用教程,以OTU表为例
猜你喜欢
- 10000+: 菌群分析
宝宝与猫狗 提DNA发Nature 实验分析谁对结果影响大 Cell微生物专刊 肠道指挥大脑 - 系列教程:微生物组入门 Biostar 微生物组 宏基因组
- 专业技能:生信宝典 学术图表 高分文章 不可或缺的人
- 一文读懂:宏基因组 寄生虫益处 进化树
- 必备技能:提问 搜索 Endnote
- 文献阅读 热心肠 SemanticScholar Geenmedical
- 扩增子分析:图表解读 分析流程 统计绘图
- 16S功能预测 PICRUSt FAPROTAX Bugbase Tax4Fun
- 在线工具:16S预测培养基 生信绘图
- 科研经验:云笔记 云协作 公众号
- 编程模板: Shell R Perl
- 生物科普: 肠道细菌 人体上的生命 生命大跃进 细胞暗战 人体奥秘
写在后面
为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。
学习扩增子、宏基因组科研思路和分析实战,关注“宏基因组”
点击阅读原文,跳转最新文章目录阅读
https://mp.weixin.qq.com/s/5jQspEvH5_4Xmart22gjMA