当前位置:   article > 正文

csvtk:表格处理神器-美化、统计、头表、合并、转置、筛选、取样、去冗余 、分列、分类汇总和简单绘图...

otu特征表合并

写在前面

CSV/TSV作为数据科学和组学分析的基本格式,其实本质上均为txt格式的表格,CSV是按逗号分隔,TSV是以制表符分隔的表格。这两种格式数据格式应用非常广泛。比较常用的处理软件包括:

  • Excel为代表的电子表格软件

  • Notepad++/Edit-plus等文本编辑器

  • sed/awk/cut等Shell命令

  • 各种编程语言,例如 R、python等。

备注:sed/awk/cut等Shell命令不适合含有标题行的CSV格式,当然这些命令的操作非常快。

csvtk软件用GO语言编写,是一个支持多平台(Winodws/Mac/Linux)的小工具,支持格式除了这两种格式外还可以处理gzip压缩的格式。无需解压即用。27个子命令支持管道组合使用,支持简单的出图。

本文主要参考软件官方教程 https://bioinf.shenwei.me/csvtk/usage,并将方法应用于扩增子分析中常用的特征表(otutab.txt)、元数据(metadata.tsv)和物种注释(taxonomy.txt)。

工具安装

软件主页:https://github.com/shenwei356/csvtk

软件下载:https://github.com/shenwei356/csvtk/releases/

各系统版本都下,下载解压即可使用。

可选使用conda安装

conda install csvtk

参数介绍

  1. # 信息
  2. headers 打印标题行,如果表格列比较多,首先查看列名方便后续操作
  3. stats 基本统计分析
  4. stats2 对指定的列进行基本统计,注意需要是数值列
  5. # 格式转化
  6. pretty 转为美观、可读性强的格式,用于打印
  7. csv2tab 转CSV为TSV
  8. tab2csv 转TSV为CSV
  9. space2tab 转空格分割格式为TSV
  10. transpose 转置CSV/TSV 这一个步骤往往看看出来工具好不好用
  11. csv2md 转CSV/TSV为makrdown格式,方便我们多平台排版,发文
  12. # 集合操作
  13. head 屏幕打印表格前面的内容,可以指定行数
  14. sample 按比例随机采样 对行进行抽样
  15. cut 选择特定列,支持按列或列名进行基本选择、范围选择、模糊选择、负向选择(最常用命令之一,非常强大)
  16. uniq 无须排序,返回按指定(多)列作为key的唯一记录
  17. freq 按指定(多)列进行计数(常用)
  18. inter 多个文件的交集
  19. grep 指定(多)列为Key进行搜索(最常用命令之一,可按指定列搜索)
  20. filter 按指定(多)列的数值进行过滤
  21. filter2 用类似awk的数值/表达式,按指定(多)列的数值进行过滤
  22. join 合并多个文件(常用)
  23. # 编辑
  24. rename 直接重命名指定(多)列名
  25. rename2 以正则表达式重命名指定(多)列名
  26. replace 以正则表达式对指定(多)列进行替换编辑(最常用命令之一,可按指定列编辑)
  27. mutate 以正则表达式基于已有列创建新的一列(常用于生成多列测试数据)
  28. mutate2 用类似awk的数值/表达式,以正则表达式基于已有(多)列创建新的一列(常用)
  29. gather 类似于R里面tidyr包的gather方法
  30. # 排序
  31. sort 按指定(多)列进行排序
  32. # 绘图
  33. plot 基本绘图
  34. plot hist histogram 直方图
  35. plot box boxplot 箱线图
  36. plot line line plot and scatter plot 线图和散点图
  37. # 其它
  38. version 版本信息和检查新版本
  39. genautocomplete 生成支持Bash自动补全的配置文件,重启Terminal生效。

使用前注意

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

实战

本次使用的数据是扩增子的otu表格和注释表格,还有分组文件。

  1. # 下载测试数据
  2. for i in otutab.txt taxonomy.txt metadata.txt otus.fa;do
  3. wget -c http://210.75.224.110/github/MicrobiomeStatPlot/Data/Science2019/$i; done
  4. mv metadata.txt metadata.tsv
  5. # 转换TSV为CSV
  6. sed 's/\t/,/g' metadata.tsv > metadata.csv
  7. # 删除行名的#号,旧版本格式,目前不常用
  8. sed -i '1 s/#//' otutab.txt

pretty 表格美化

  • csvtk pretty让打印出来的内容排版更加美丽,其实对于tsv文件影响不大,要加上全局参数-t,但是对于csv文件影响还是挺大的。

注意csvtk主要用于处理csv数据,对于txt数据尽量转化为csv数据整理,否则好多操作都不能实现。

  1. # 预览csv
  2. head -n3 metadata.csv
  3. # SampleID,Group,Date,Site,Sequencing,Platform,Species,Batch,BarcodeSequence,LinkerPrimerSequence,ReversePrimer
  4. # KO1,KO,2017/6/30,Beijing,BGI,HiSeq2500,Arabidopsis,1,ACGCTCGACA,AACMGGATTAGATACCCKG,ACGTCATCCCCACCTTCC
  5. # KO2,KO,2017/6/30,Beijing,BGI,HiSeq2500,Arabidopsis,1,ATCAGACACG,AACMGGATTAGATACCCKG,ACGTCATCCCCACCTTCC
  6. # 可视化csv
  7. csvtk pretty metadata.csv|head -n3
  8. # SampleID Group Date Site Sequencing Platform Species Batch BarcodeSequence LinkerPrimerSequence ReversePrimer
  9. # KO1 KO 2017/6/30 Beijing BGI HiSeq2500 Arabidopsis 1 ACGCTCGACA AACMGGATTAGATACCCKG ACGTCATCCCCACCTTCC
  10. # KO2 KO 2017/6/30 Beijing BGI HiSeq2500 Arabidopsis 1 ATCAGACACG AACMGGATTAGATACCCKG ACGTCATCCCCACCTTCC
  11. # TSV格式使用pretty 打印样式影响不大
  12. head -n3 otutab.txt
  13. # 自动去除了表头
  14. csvtk -H pretty otutab.txt | head -n3

stat 统计行列

注意csv格式正常统计,但是tsv格式统计列数量错误;

  1. csvtk stat metadata.csv
  2. # file num_cols num_rows
  3. # metadata.csv 11 18
  4. #--注意使用tsv格式文件需要添加参数 -t
  5. csvtk stat metadata.tsv -t
  6. # file num_cols num_rows
  7. # metadata.tsv 1 18

headers 打印表头

  1. -h, --help help 文件调用
  2. -v, --verbose 打印冗余信息,用#号分隔的文件名称
  1. # 默认去除#号注释行,如果存在#号行,-C指定一个不常用字符
  2. csvtk -t headers otutab.txt -C !
  3. #OTUID
  4. #KO1
  5. #KO2
  6. ···
  7. csvtk headers otutab.txt -t -v
  8. # otutab.txt
  9. #1 #OTUID
  10. #2 KO1
  11. #3 KO2
  12. ···

dim/nrow/ncol 文件行列统计

这里需要注意的式-n参数可以用于多文件统计,没有表头记得加上-H参数。

  1. --cols 只打印文件列数量
  2. -h, --help 调用帮助文件
  3. -n, --no-files 不打印文件名
  4. --rows 只打印文件行数量
  5. --tabular 输出机器友好的tab格式文件
  1. # 默认输出列和行数量
  2. csvtk -t dim otutab.txt
  3. #file num_cols num_rows
  4. #otutab.txt 19 2,631
  5. #仅仅输出行数量
  6. csvtk -t nrow otutab.txt
  7. #2631
  8. # 仅仅输出列数量
  9. csvtk ncol otutab.txt -t
  10. # 19
  11. #--注意同时统计多个文件可以在后面加上-n参数
  12. csvtk dim *.txt -t -n
  13. #file num_cols num_rows
  14. #otutab.txt 19 2,631
  15. #taxonomy.txt 8 2,631

summary 统计

选定的数字或文本字段的汇总统计信息(按组分组字段),注意不能混用列名和数字标识

所支持的函数:countn (count numeric values), min, max, sum,
 mean, stdev, variance, median, q1, q2, q3,
 entropy (Shannon entropy),
 prod (product of the elements);

支持的调用语法:
count, first, last, rand, unique, collapse, countunique。

  1. Flags:
  2. -n, --decimal-width int 限制浮点数为N个小数点(默认为2)
  3. -f, --fields strings 统计类型指定:operations on these fields. e.g -f 1:count,1:sum or -f colA:mean. available operations: collapse, count, countn, countunique, entropy, first, last, max, mean, median, min, prod, q1, q2, q3, rand, stdev, sum, uniq, variance
  4. -g, --groups string 分组,按照行或者列:group via fields. e.g -f 1,2 or -f columnA,columnB
  5. -h, --help 调用帮助文件
  6. -i, --ignore-non-numbers 忽略NA值:"NA" or "N/A"
  7. -S, --rand-seed int 设定随机种子,默认11 "rand" (default 11)
  8. -s, --separater string separater for collapsed data (default "; ")

下面就一个列进行统计,主要是训练这些常用函数的用法。很多时候可以联合使用。注意经常我们的数据中有NA存在,此时加上-i。

  1. #-对指定列WT2进行求和,获得某样本的总数据量
  2. cat otutab.txt | csvtk summary -f WT2:sum -t
  3. # 求均值
  4. cat otutab.txt | csvtk summary -f WT2:mean -t
  5. # 统计该列的长度,即行数
  6. cat otutab.txt | csvtk summary -f WT2:countn -t
  7. #-对应的max,min和first,last是一个道理,也就是下面的命令同等有效:
  8. cat otutab.txt | csvtk summary -f WT2:first -t
  9. cat otutab.txt | csvtk summary -f WT2:max -t
  10. # 统计方差:variance
  11. cat otutab.txt | csvtk summary -f WT2:variance -t
  12. # 统计标准差
  13. cat otutab.txt | csvtk summary -f WT2:stdev -t
  14. # 提取非重复值
  15. cat otutab.txt | csvtk summary -f WT2:uniq -t
  16. # 对去除重复值后的值统计数量
  17. cat otutab.txt | csvtk summary -f WT2:countunique -t

对多个列同时进行统计:

  1. cat otutab.txt | csvtk summary -f WT2:countunique,OE1:uniq -t
  2. cat otutab.txt | csvtk summary -f WT2:mean,OE1:mean -t

join 连接数据框

该功能和R包dplyr的许多功能类似,用法类似,例如这个功能:共有连接,左连接,全部连接。可以支持多个共有列。默认如果不加参数,会进行共有列连接。

  1. csvtk join -h
  2. -f, --fields string Semicolon separated key fields of all files, if given one, we think all the files have the same key columns. Fields of different files should be separated by ";", e.g -f "1;2" or -f "A,B;C,D" or -f id (default "1")
  3. -F, --fuzzy-fields using fuzzy fields, e.g., -F -f "*name" or -F -f "id123*"
  4. -h, --help help for join
  5. -i, --ignore-case ignore case
  6. -k, --keep-unmatched keep unmatched data of the first file (left join)
  7. -L, --left-join left join, equals to -k/--keep-unmatched, exclusive with --outer-join
  8. --na string content for filling NA data
  9. -O, --outer-join outer join, exclusive with --left-join

实例,这里我们的实例都是来自于微生物组分析得到的表格,让大家可以更好的应用于微生物组数据分析和实践。

  1. #-合并OTU表格和注释文件 -f 1 指定第一列为合并公共列
  2. csvtk -t join -f 1 otutab.txt taxonomy.txt | csvtk -t dim
  3. #file num_cols num_rows
  4. #- 26 2,631
  5. # 保存结果,供后面使用
  6. csvtk -t join -f 1 otutab.txt taxonomy.txt > otutax.txt
  7. # 演示一下左连接:仅保留第一个文件的列
  8. head otutab.txt > otutab_sub.txt
  9. csvtk -t join -f 1 otutab_sub.txt taxonomy.txt --left-join | csvtk -t dim
  10. #file num_cols num_rows
  11. #- 26 9
  12. #--如果左连接第二个表格没有对应的信息,则使用NA填充空位
  13. head -n9 taxonomy.txt > taxonomy_sub.txt
  14. csvtk -t join -f 1 otutab_sub.txt taxonomy_sub.txt --na NA --left-join
  15. #--全部合并,对于空缺位置可以随意标示,0,或者NA或者自己的名字也可以
  16. csvtk -t join -f 1 otutab_sub.txt taxonomy_sub.txt --outer-join --na wentao
  1. # 通过列名来指定合并列
  2. csvtk -t join -f "OTUID;OTUID" otutab.txt taxonomy.txt |csvtk -t dim

add-header 添加表头

  1. # 准备一下无表头的表
  2. cut -f 1-3 metadata.tsv | tail -n+2 | head -n2 > metatest.txt
  3. cat metatest.txt
  4. #KO1 KO 2017/6/30
  5. #KO2 KO 2017/6/30
  6. # 添加表头
  7. csvtk -t add-header -n SampleID,Group,Date metatest.txt
  8. #SampleID Group Date
  9. #KO1 KO 2017/6/30
  10. #KO2 KO 2017/6/30
seqkit fx2tab 序列转表格

当我知道csvtk和seqkit是一个作者写的后,我就开始肆无忌惮的的联用这两个工具了,seqkit的安装和使用参考如下教程:

例如下面我们将演示三个表格合并,此时需要处理一下代表序列文件,作为除了otu表格和注释表格之外的第三个表格:将fa格式转化为tsv格式,删除结尾多余制表符,再添加表头

  1. seqkit fx2tab otus.fa|cut -f 1-2 |csvtk -t add-header -n OTUID,Sequence > otus_fa.txt
  2. # 然后转化为csv格式预览,按q退出预览
  3. csvtk tab2csv otus_fa.txt|less -S
三个文件合并
  1. # 通过第一列合并
  2. csvtk -t join -f 1 otutab.txt taxonomy.txt otus_fa.txt |head
  3. # 通过共有列名合并
  4. csvtk -t join -f OTUID otutab.txt taxonomy.txt otus_fa.txt |head
join+summary分组统计
  1. # -g 参数指定分组
  2. cat otutax.txt | csvtk -t summary -i -f OE2:mean,WT2:mean -g Phylum
  3. # 指定多个分组
  4. cat otutax.txt | csvtk -t summary -i -f OE2:mean,WT2:mean -g Phylum,Class

transpose 转置数据框

转置这一个步骤相当消耗时间,尤其是宏基因组的较大的表格。

  1. #--转置,提取表头,打印前面几个
  2. csvtk -t transpose otutab.txt |csvtk -t headers |head

cut 列名筛选

  1. # -f 参数可以使用数字指定列 并挑选出来
  2. csvtk -t cut -f 1,3 otutab.txt | csvtk -t headers
  3. # -f 也可以通过列名来指定并打印列
  4. csvtk -t cut -f OE2 otutab.txt | csvtk -t headers
  5. # 去掉列只需要在序号前面加上-即可,这里去除第二和第三列
  6. csvtk -t cut -f -2,-3 otutab.txt | csvtk -t headers
  7. # 指定范围去除某些列,这里去除第二列到第六列
  8. csvtk -t cut -f -6--2 otutab.txt | csvtk -t headers
  9. # 注意负号添加在列名字前面同样有效
  10. csvtk -t cut -f -OE1 otutab.txt | csvtk -t headers

使用-F参数,使用双引号,可以使用正则而表达式。

  1. # 筛选W和OE开头的列
  2. csvtk -t cut -F -f "OTUID,W*,OE*" otutab.txt | csvtk -t headers
  3. #--无论是按照数字还是列名指定列,这个顺序就是打印出来的顺序。
  4. csvtk -t cut -F -f "OTUID,OE1,WT1" otutab.txt | csvtk -t headers

csv2md 表格转化为markdown格式

在用markdown写笔记,或做网页时,经常需要把表格排版为markdown格式,手动排版非常耗时。使用此工具会极方便

cut -f 1-7 metadata.tsv | csvtk -t csv2md
  1. SampleID|Group|Date |Site |CRA |CRR |BarcodeSequence
  2. :-------|:----|:--------|:--------|:---------|:--------|:--------------
  3. KO1 |KO |2017/6/30|Chaoyang |CRA002352 |CRR117575|ACGCTCGACA
  4. KO2 |KO |2017/6/30|Chaoyang |CRA002352 |CRR117576|ATCAGACACG
  5. KO3 |KO |2017/7/2 |Changping|CRA002352 |CRR117577|ATATCGCGAG

csv2xlsx 转化为xlsx格式

  1. # 无需指定输出,会生成 otutab.txt.xlsx 的Excel表格输出
  2. csvtk -t csv2xlsx otutab.txt
  3. # -o 指定输出文件名
  4. csvtk -t csv2xlsx otutab.txt -o otutab.xlsx

xlsx2csv Excel转换为文本表格

  1. Flags:
  2. -h, --help help for xlsx2csv
  3. -a, --list-sheets 转化全部的sheet
  4. -i, --sheet-index int 指定sheet (default 1)
  5. -n, --sheet-name string sheet to retrieve
  1. # -将xlsx转化为csv文件,显示表格中sheet编号
  2. csvtk xlsx2csv -a otutab.txt.xlsx
  3. # 转化第一张sheet,输出到屏幕
  4. csvtk -t xlsx2csv -i 1 otutab.txt.xlsx | head

head 查看前n行的数据

 -n, --number int  指定需要查看数据的行数
  1. # 查看前十行数据
  2. csvtk head otutab.txt -n 10

concat 按照行合并表

  1. Flags:
  2. -h, --help help for concat
  3. -i, --ignore-case 忽略列名 (column name)
  4. -k, --keep-unmatched keep blanks even if no any data of a file matches
  5. -u, --unmatched-repl string replacement for unmatched data
  1. # 需要列名一样, 但是顺序可以不一样,并去除多余表头
  2. wc -l otutab_sub.txt otutab.txt
  3. csvtk -t concat otutab_sub.txt otutab.txt | wc -l
  4. # 不同时默认共有列合并,-i忽略大小写
  5. csvtk -t concat otutab_sub.txt otutab.txt -i | csvtk -t stat
  6. # -u 将未匹配上的行使用Unmached补全
  7. csvtk concat otutab_sub.txt otutab.txt -u Unmached | csvtk -t stat

sample 按照比例抽样

  1. Flags:
  2. -h, --help help for sample
  3. -n, --line-number 打印第一列,行号 ("n")
  4. -p, --proportion float 按照比例抽样
  5. -s, --rand-seed int 随机种子(default 11)
  1. # 按照比例抽样,抽取一半,没有表头添加参数-H
  2. seq 100 | csvtk sample -H -p 0.5 | wc -l
  3. #46
  4. # 抽取十分之一
  5. seq 100 | csvtk sample -H -p 0.1 | wc -l
  6. # 10
  7. # 打印行号
  8. seq 100 | csvtk sample -H -p 0.05 -n
  9. #50,50
  10. #52,52
  11. #65,65

cut 选择列

  1. 例子:
  2. 1. 选择单个列,根际列序号或者列名
  3. csvtk cut -f 1
  4. csvtk cut -f colA
  5. 2. 多个列选择 (可以重复列名,调整顺序)
  6. csvtk cut -f 1,3,2,1
  7. csvtk cut -f colA,colB,colA
  8. 3. 选择列可用于列排序
  9. csvtk cut -f 1,3-5 # 1, 3, 4, 5
  10. csvtk cut -f 3,5- # 3rd col, and 5th col to the end 第五列发放最后面
  11. csvtk cut -f 1- # 全选列
  12. csvtk cut -f 2-,1 # move 1th col to the end
  13. 4. 负号放到前面代表去除某一列
  14. csvtk cut -f -1,-3 # discard 1st and 3rd column
  15. csvtk cut -f -1--3 # discard 1st to 3rd column
  16. csvtk cut -f -2- # discard 2nd and all columns on the right.
  17. csvtu cut -f -colA,-colB # discard colA and colB
  18. Flags:
  19. -f, --fields string 选择列. type "csvtk cut -h" for examples
  20. -F, --fuzzy-fields 模糊选择,正则表达书,用单引号括起来, e.g., -F -f "*name" or -F -f "id123*"
  21. -h, --help help for cut
  22. -i, --ignore-case ignore case (column name)
  23. -u, --uniq-column deduplicate columns matched by multiple fuzzy column names
  1. # 列名选择
  2. csvtk -t cut -f OE2 otutab.txt |head
  3. #OE2
  4. #1610
  5. #497
  6. # 序号选择
  7. csvtk -t cut -f 2,3,5 otutab.txt |head
  8. #KO1 KO2 KO4
  9. #1073 1926 1356
  10. #1965 1233 2241
  11. # 模糊选择
  12. csvtk -t cut -F -f 'OE*' otutab.txt |head
  13. #OE1 OE2 OE3 OE4 OE5 OE6
  14. #1259 1610 1337 944 1245 1013
  15. #641 497 1225 1271 948 638
  16. # 去除某些列
  17. csvtk -t cut -f -1,-2,-3 otutab.txt |head
  18. #KO3 KO4 KO5 KO6 OE1 OE2
  19. #810 1356 1064 1069 1259 1610
  20. #2368 2241 2901 1835 641 497
  21. # 选择第八列以及之后的全部列
  22. csvtk -t cut -f 8- otutab.txt |head
  23. #OE1 OE2 OE3 OE4 OE5 OE6 WT1 WT2 WT3 WT4 WT5 WT6
  24. #1259 1610 1337 944 1245 1013 2303 2512 1698 1974 1441 1544
  25. #641 497 1225 1271 948 638 1286 1499 843 1122 1496 1177
  26. # 选择第八列到第十列
  27. csvtk -t cut -f 8-10 otutab.txt |head
  28. #OE1 OE2 OE3
  29. #259 1610 1337

uniq 去除重复

按照某列去除重复

  1. # 挑选界,对界进行去除重复
  2. csvtk -t cut -f 2 taxonomy.txt |csvtk uniq -f 1
  3. #Kingdom
  4. #Bacteria
  5. #Archaea
  6. # 直接对注释文件某列去除重复,不考虑其他列
  7. csvtk -t uniq -t -f 2 taxonomy.txt
  8. #OTUID,Kingdom,Phylum,Class,Order,Family,Genus,Species
  9. #ASV_657,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Thermomonosporaceae,Unassigned,Unassigned
  10. #ASV_1646,Archaea,Thaumarchaeota,Unassigned,Nitrososphaerales,Nitrososphaeraceae,Nitrososphaera,Unassigned

freq 统计频数

  1. Flags:
  2. -f, --fields string select only these fields. e.g -f 1,2 or -f columnA,columnB (default "1")
  3. -F, --fuzzy-fields 模糊选择, e.g., -F -f "*name" or -F -f "id123*"
  4. -i, --ignore-case ignore case
  5. -r, --reverse 反转排序
  6. -n, --sort-by-freq 按照频数排序
  7. -k, --sort-by-key 按照键排序
  1. # 对第二列统计频数
  2. csvtk -t freq -f 2 taxonomy.txt
  3. #Kingdom,frequency
  4. #Archaea,1
  5. #Bacteria,2630
  6. # 按数值反转排序
  7. csvtk -t freq -f 2 taxonomy.txt -n -r
  8. #Kingdom,frequency
  9. #Bacteria,2630
  10. #Archaea,1

inter 选择多个文件共有列内容

  1. csvtk -t inter otutab.txt taxonomy.txt |head
  2. #OTUID
  3. #ASV_2700
  4. #ASV_2092

grep 指定列匹配(支持正则)

  1. Flags:
  2. -f, --fields string comma separated key fields, column name or index. e.g. -f 1-3 or -f id,id2 or -F -f "group*" (default "1")
  3. -F, --fuzzy-fields 模糊选择, e.g., -F -f "*name" or -F -f "id123*"
  4. -h, --help help for grep
  5. -i, --ignore-case ignore case
  6. -v, --invert 去除匹配上的行
  7. -n, --line-number 打印行号 ("n")
  8. -N, --no-highlight 不高亮
  9. -p, --pattern strings 优雅答应选项(multiple values supported)
  10. -P, --pattern-file string pattern files (one pattern per line)
  1. # 选择第3列门是Actinobacteria 的行
  2. csvtk -t grep -f 3 -p Actinobacteria taxonomy.txt
  3. # 可用列表 -P 接匹配列表
  4. # 构建一个id列表,并去除表头
  5. csvtk -t cut -f 1 otutab.txt | head | csvtk del-header > id.txt
  6. # 使用-P选项后面接列表,比awk筛选更方便
  7. csvtk -t grep -f 1 -P id.txt taxonomy.txt

filter 列条件过滤

  1. # 选择OE2 列序列数量大于500的行
  2. csvtk -t filter -f "OE2>500" otutab.txt
  3. #支持多列共同筛选
  4. csvtk -t filter -f "2-5>300" otutab.txt
  5. # 注意模糊匹配使用-F选项,所有列均满足条件
  6. csvtk -t filter -F -f "OE*>500" otutab.txt
  7. #OTUID,KO1,KO2,KO3,KO4,KO5,KO6,OE1,OE2,OE3,OE4,OE5,OE6,WT1,WT2,WT3,WT4,WT5,WT6
  8. #ASV_657,1073,1926,810,1356,1064,1069,1259,1610,1337,944,1245,1013,2303,2512,1698,1974,1441,1544

split 数据列拆分为多文件

  1. # 按照门进行拆分文件-会以门的名字命名
  2. csvtk -t split taxonomy.txt -f Phylum
  3. # 查看分出来的文件
  4. ls taxonomy-*
  5. # 删除这些文件,太多使目录变混乱
  6. rm taxonomy-*
  7. # 通过指定-o输出到一个文件夹中
  8. mkdir -p split
  9. csvtk -t split taxonomy.txt -f Phylum -o split/
  10. # 指定两个列进行分析
  11. csvtk -t split taxonomy.txt -f Phylum,Class -o split/

comb 对每一行的元素进行组合

  1. # 两两组合
  2. csvtk -t cut -f 1,2,3 taxonomy.txt |head -n 2 |csvtk -t comb -n 2
  3. #ASV_657,Bacteria
  4. #ASV_657,Actinobacteria
  5. #Bacteria,Actinobacteria
  6. # 三个组合
  7. csvtk -t cut -f 1,2,3,4 taxonomy.txt |head -n 2 |csvtk -t comb -n 3
  8. # 断棍模型-单个到全部组合都做出来
  9. csvtk -t cut -f 1,2,3,4 taxonomy.txt |head -n 2 |csvtk -t comb -n 0

add-header 添加列名

  1. # seq生成序列,mutate添加一列,add-header--添加列名为a,b
  2. seq 3 | csvtk mutate -H |csvtk add-header -n a,b
  3. #a,b
  4. #1,1
  5. #2,2
  6. # 可以分别用-n参数指定-n a -n b
  7. seq 3 | csvtk mutate -H csvtk add-header -n a -n b
  8. #a,b
  9. #1,1
  10. #2,2

del-header 删除列名

  1. # 添加列名
  2. seq 3 | csvtk add-header
  3. #添加后删除列名
  4. seq 3 | csvtk add-header | csvtk del-header
  5. # 或者使用-H参数指定无表头防止误删
  6. seq 3 | csvtk del-header -H

rename 列名重命名

  1. csvtk -t cut -f 1-2 taxonomy.txt |head |csvtk -t rename -f 1-2 -n B,P
  2. #B,P
  3. #ASV_657,Bacteria
  4. #ASV_2,Bacteria

round 保留小数点位数

  1. cut -f1-3 otutab.txt |csvtk -t round -n 2 -f KO1 |head
  2. #OTUID KO1 KO2
  3. #ASV_657 1073.00 1926
  4. #ASV_2 1965.00 1233

mutate 根据规则创建新列

  1. # 使用已有列改名 作为新的一列
  2. csvtk -t mutate -f Class -n Class2 taxonomy.txt | head -n3
  3. #OTUID Kingdom Phylum Class Order Family Genus Species Class2
  4. #ASV_657 Bacteria Actinobacteria Actinobacteria Actinomycetales Unassigned Unassigned Unassigned Actinobacteria
  5. #ASV_2 Bacteria Proteobacteria Betaproteobacteria Burkholderiales Comamonadaceae Pelomonas Pelomonas_puraquae Betaproteobacteria
  6. # 复杂一点:将otu表格otu名字种otu部分 提取出来做为group列
  7. csvtk -t mutate -f 1 -n group -p "^(.+?)[0-9]" otutab.txt |head -n3
  8. #OTUID KO1 KO2 KO3 KO4 KO5 KO6 OE1 OE2 OE3 OE4 OE5 OE6 WT1 WT2 WT3 WT4 WT5 WT6 group
  9. #ASV_657 1073 1926 810 1356 1064 1069 1259 1610 1337 944 1245 1013 2303 2512 1698 1974 1441 1544 ASV_
  10. #ASV_2 1965 1233 2368 2241 2901 1835 641 497 1225 1271 948 638 1286 1499 843 1122 1496 1177 ASV_

mutate2 更为强大地创造新列

  1. # 使用字符串重复,作为一个新列
  2. cut -f 1-3 otutab.txt |csvtk -t mutate2 -t -e " 'abc' " -n group |head -n3
  3. #OTUID KO1 KO2 group
  4. #ASV_657 1073 1926 abc
  5. #ASV_2 1965 1233 abc
  6. # 列 合并,如果是字符串,可以合并在一起
  7. cut -f 1-4 taxonomy.txt |csvtk -t mutate2 -n Comname -e ' $Class + "-" + $Phylum ' |head
  8. #OTUID Kingdom Phylum Class Comname
  9. #ASV_657 Bacteria Actinobacteria Actinobacteria Actinobacteria-Actinobacteria
  10. #ASV_2 Bacteria Proteobacteria Betaproteobacteria Betaproteobacteria-Proteobacteria
  11. #ASV_3 Bacteria Proteobacteria Gammaproteobacteria Gammaproteobacteria-Proteobacteria
  12. #如果是数值可以进行基本算数运算-例如两列求和
  13. cut -f1-7 otutab.txt |csvtk -t mutate2 -n sum12 -e ' $3 + $2 ' |head
  14. #OTUID KO1 KO2 KO3 KO4 KO5 KO6 sum12
  15. #ASV_657 1073 1926 810 1356 1064 1069 2999.00
  16. #ASV_2 1965 1233 2368 2241 2901 1835 3198.00
  17. # 使用逻辑判断,添加新列
  18. cut -f1-7 otutab.txt | csvtk -t mutate2 -n sum12 -e ' $2>1000' |head
  19. #OTUID KO1 KO2 KO3 KO4 KO5 KO6 sum12
  20. #ASV_657 1073 1926 810 1356 1064 1069 true
  21. #ASV_2 1965 1233 2368 2241 2901 1835 true
  22. #ASV_3 567 460 898 902 1224 854 false
  23. # 可以使用条件分配逻辑判断的填充
  24. cut -f1-7 otutab.txt |csvtk -t mutate2 -n sum12 -e ' $3>1000? "small" : "big"' |head
  25. #OTUID KO1 KO2 KO3 KO4 KO5 KO6 sum12
  26. #ASV_657 1073 1926 810 1356 1064 1069 small
  27. #ASV_2 1965 1233 2368 2241 2901 1835 small
  28. #ASV_3 567 460 898 902 1224 854 big

collapse 分类汇总/合并同类项

  1. # 想知道每个门中有哪些ASV
  2. cat taxonomy.txt |csvtk -t collapse -f 1,2,3 -v 1 -s ';' | less -S > phylum_ASV.txt

sep 指定分隔符分隔一列内容

  1. # -n 指定分隔出来的内容名称,这里指定两个,那就只会分出来两个,多指定几个,那就多分出来几个。
  2. csvtk -t sep phylum_ASV.txt -f3 -s ";" -n OTU1,OTU2 --drop | less -S
  3. #Kingdom Phylum OTUID OTU1 OTU2
  4. #Bacteria Ignavibacteriae ASV_1159;ASV_2278 ASV_1159 ASV_2278
  5. #Archaea Thaumarchaeota ASV_1646 ASV_1646
  6. #Bacteria Armatimonadetes ASV_989;ASV_1709;ASV_1839;ASV_2014 ASV_989 ASV_1709
  7. #Bacteria Gemmatimonadetes ASV_2825 ASV_2825
  8. # --merge 会将剩下的内容放到最后一列
  9. csvtk -t sep phylum_ASV.txt -f3 -s ";" -n OTU1,OTU2 --merge| less -S

gather 表格宽变长(用于绘图)

  1. # 按照第一列作为索引,将数据变为长数据,方便出图
  2. cat otutab.txt |csvtk -t gather -k SampleID -v value -f -1 |head
  3. #OTUID SampleID value
  4. #ASV_657 KO1 1073
  5. #ASV_657 KO2 1926
  6. #ASV_657 KO3 810
  7. # 下面使用id和界作为索引,变化为长数据
  8. cat otutax.txt |csvtk -t gather -k id -v value -f -1,-21 |head
  9. #OTUID Phylum id value
  10. #ASV_657 Actinobacteria KO1 1073
  11. #ASV_657 Actinobacteria KO2 1926

fold 归类

  1. # 选择门和科这两个等级数据,并去除重复,然后按照门,将科归类到 门后面,默认使用 “;” 分隔
  2. # 某个门中有哪 些科,和collapse有点类似,按; 分隔
  3. cat taxonomy.txt | csvtk -t uniq -f Phylum,Class |csvtk -t fold -f Phylum -v Class
  4. # 换用逗号和空格作为分隔符
  5. cat taxonomy.txt | csvtk -t uniq -f Phylum,Class |csvtk -t fold -f Phylum -v Class -s ", "
  6. # 下面按照门和钢给OTU做分类
  7. cat taxonomy.txt |csvtk -t collapse -f 1,2,3 -v 1 -s ';' | head

plot 做箱线图 频数分布,线图

由于使用go出图并不能达到我们的发文预期,所以这里只是简单的看看。优点是命令行一行完成,不用像R解决文件读写,更高效。

plot hist 绘制直方图
  1. # 对表格的第三列绘制直方图
  2. csvtk -t plot hist otutab.txt -f 3 --title Histogram -o histogram.png
  3. # 直接展示
  4. csvtk plot hist otutab.txt -f 3 --title Histogram | display

plot box 绘制箱线图
  1. # 设置-g参数用于指定x周坐标,-f 指定y周内容
  2. csvtk -t plot box otutax.txt -g Phylum -f "OE2" --width 12 --title "wentao" > boxplot.png

  1. # 坐标轴反转一下
  2. csvtk -t plot box otutax.txt -g Phylum -f "OE2" --width 12 --horiz --title "wentao" > boxplot2.png

plot line 绘制线图

  1. csvtk -t plot line otutax.txt -x OE2 -y WT2 -g Phylum --title "Line plot" > lineplot.png
  2. csvtk -t plot line otutax.txt -x OE2 -y WT2 -g Phylum --title "Line plot" --scatter > lineplot2.png

其他功能

watch  统计频数,直方图可视化

csvtk -t watch -O hist.pdf -f WT1 otutab.txt

csvtk corr 计算两列之间的皮尔逊相关

这里使用的txt文件,所以添加了-t全局参数,这里作者帮助文件显示只能计算这一种相关,如果我们做微生物组分析,斯皮尔曼相关更加适合

  1. csvtk -t corr -i -f WT1,WT2 otutab.txt
  2. # WT1 WT2 0.9373

csv2json 转化csv格式为json格式

head -n3 otutab.txt | csvtk -t csv2json

filter2 filter的增强版 使用类似awk来高级做高级筛选

功能更强大,但用法稍微不同。

  1. csvtk -t filter2 -f '$OE1 > 500 || $WT2 > 100' otutab.txt |head
  2. #OTUID,KO1,KO2,KO3,KO4,KO5,KO6,OE1,OE2,OE3,OE4,OE5,OE6,WT1,WT2,WT3,WT4,WT5,WT6
  3. #ASV_657,1073,1926,810,1356,1064,1069,1259,1610,1337,944,1245,1013,2303,2512,1698,1974,1441,1544
  4. #ASV_2,1965,1233,2368,2241,2901,1835,641,497,1225,1271,948,638,1286,1499,843,1122,1496,1177

splitxlsx 拆分xlsx中的sheet表格

csvtk xlsx2csv -a otutab.txt.xlsx

参考文献

软件管方教程:https://bioinf.shenwei.me/csvtk/usage

往期精品(点击图片直达文字对应教程)

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/237870
推荐阅读
相关标签
  

闽ICP备14008679号