csvtk处理csv和tsv文件

处理csv (tsv) 的工具已经见过不少,如csvkit,xsv。而csvtk这个工具的一些子命令却能解决一些前者无法解决的痛点,这些痛点可能需要你自己写脚本。

软件版本:0.18.2

地址:https://github.com/shenwei356/csvtk

headers

1
$ csvtk headers test.txt  #显示文件打印标题行,-t参数可设定制表符分割,默认逗号分割

pretty csv2tab tab2csv space2tab transpose csv2md

1
2
3
4
5
6
$ csvtk pretty test.txt  #对csv更友好的展示
$ csvtk csv2tab test.txt #转换csv格式到tab
$ csvtk tab2csv test.txt #转换tab格式到csv
$ csvtk space2tab test.txt #转换空格分割格式到tab
$ csvtk transpose test.txt #转置csv/tsv **
$ csvtk csv2md test.txt #转csv/tsv为makrdown格式

cut

1
2
3
$ csvtk cut -f 1,3-4,7-8 test.txt #选取1,3到4,7到8列
$ csvtk cut -F -f '*.id,name' test.txt # -F开启模糊搜索
$ csvtk cut -f -2,-3 test.txt #选取第2,3列之外的列

uniq

1
2
3
$ csvtk uniq -f 1 test.txt #最解决痛点的子命令,指定列进行删除重复数据,会保留第一个发现的数据
#linux 自带的uniq会认定整行为一个判断单位,当blast比对中会有很多序列比对到一个序列,而我们只想保留
#第一列的一个字段就好了,这时csvtk uniq 可以轻松处理这个问题。

grep

1
2
$ csvtk grep -f 1 -p 'name' test.txt  #同uniq一样,grep也可以指定列去搜索(精确搜索)
$ csvtk grep -f 1 -p 'name' -r test.txt # -r 开启正则(模糊搜索)

join

1
2
3
$ csvtk join -f '1;1'  test1.csv test2.csv #按照2个文件的第一列合并文件,等于-f '1'
$ csvtk join -f '1;2' test1.csv test2.csv #按照2个文件的第一列和第二列合并文件
csvtk join -f '1;2' --keep-unmatched test1.csv test2.csv #保留第一个文件中未匹配的行

fliter filter2

1
2
$ csvtk filter -f '9>1000' test.txt  #过滤选择第9列大于1000的行
$ csvtk filter2 -f '$7 > $8' test.txt #类似awk过滤

replace

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ csvtk replace -f id -p '(\d+)' -r 'ID: $1' #将id列数据(\d+)换为'ID: \d+'

$ cat data.csv

name id
A ID001
B ID002
C ID004

$ cat alias.csv

001 Tom
002 Bob
003 Jim

$ csvtk replace -f 2 -p "ID(.+)" -r "N: {nr}, alias: {kv}" -K -k alias.csv data.csv

name id
A N: 1, alias: Tom
B N: 2, alias: Bob
C N: 3, alias: 004
#使用alias.csv中的键值对进行替换,{nr}代表计数,{kv}代表值,-K代表当键值对中找不到对应的键时使用原文件中的键。-k代表键值对文件

rename

1
csvtk rename -f 1,2 -n id1,id2 test.txt #将第1,2列的标题改为id1和id2

mutate2

1
$ csvtk mutate2  -n test -e '$1+$2'  test.txt #添加新列,-n 新列标题,-e 处理方式(awk模式)

sort

1
2
3
$ csvtk sort -k 2:n test.txt #-k 制定排序规则,2:n意义为按第二列排序,并认为数据为数字
$ csvtk sort -k 1:N test.txt #-k 制定排序规则,1:N意义为按第一列排序,并认为数据为字符串与数字混合
$ csvtk sort -k 3:n,4:n test.txt #按照第三四列排序

summary

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ csvtk summary -f f4:sum,f5:sum -i test.txt #统计第四五列数字总和,-i 忽略非数字列
$ csvtk summary -f f4:sum,f5:sum -g f1,f2 -i test.txt #统计第四五列数字总和,按第一二列groupby
$ csvtk summary -H -i -f 4:sum,5:sum -g 1,2 #在列表没有 header 时统计第四五列数字总和,按第一二列groupby

-f 支持的参数:
collapse #以行的形式展示数据
count #计数不忽略NA
countn #计数忽略NA
first #第一个字符
last #最后一个字符
max #最大的数
mean #平均数
median #中位数
min #最小数
stdev #标准差
sum #总和
uniq #唯一字符
variance #方差