寫在前面
能干什么吞歼? 學(xué)習(xí)任何一個(gè)工具或是文章中的一類炫酷圖表時(shí),我覺得首先需要能明白:這個(gè)工具/這類圖表能干什么塔猾?這個(gè)工具/圖的展示方式是最好的么篙骡,還有哪些不足之處。然后再是將這個(gè)工具/圖表整合到自己的知識框架系統(tǒng)里面丈甸。等下次有類似需求的時(shí)候糯俗,就能夠在個(gè)人的知識系統(tǒng)里面調(diào)用這類工具/圖表去實(shí)現(xiàn)你的想法。
學(xué)習(xí)生物信息的分析流程過程中睦擂,需要處理各種格式的文件類型叶骨,如gtf/gff、vcf祈匙、bam等,其實(shí)這些文件本質(zhì)上就是以tab作為分隔符的文本文件天揖。我們利用各種生信工具(bedtools/vcftools/samtools)夺欲、grep/awk/sed,或者是自己寫程序?qū)ζ溥M(jìn)行處理來實(shí)現(xiàn)自己的目的今膊,而在這過程中速度和效率就是個(gè)很重要的因素些阅。有時(shí)候自己在處理文件時(shí)花時(shí)間去寫的一些腳本,用完就扔斑唬。偶然了解到csvtk這個(gè)工具市埋,發(fā)現(xiàn)其實(shí)以前寫的許多腳本在這個(gè)工具中一行命令就能解決黎泣,是個(gè)效率提升的好輪子,決定好好學(xué)習(xí)一下csvtk的使用缤谎。
csvtk是shenwei爪哥開發(fā)的又一大利器抒倚。據(jù)說是shenwei在投稿seqkit文章時(shí)順便寫的工具。(fasta/fq文件處理萬能工具——Seqkit學(xué)習(xí)記錄)嗯坷澡,我也希望能在以后科研空閑時(shí)開發(fā)一些為人民服務(wù)的好輪子托呕。話說回來了,能用csvtk這類好輪子频敛,更要能自己去造輪子项郊。在利用工具去快速實(shí)現(xiàn)一些目標(biāo)的時(shí)候,也需要想一想斟赚,如果是自己利用不同的語言去寫程序?qū)崿F(xiàn)着降,思路是什么?時(shí)常寫一寫也可以保持自己的coding的能力拗军。
本教程根據(jù)官方說明文檔(https://bioinf.shenwei.me/csvtk/usage/)做的學(xué)習(xí)任洞,推薦可以根據(jù)官方Usage中的各種例子去多多練習(xí),示例文件地址(https://github.com/shenwei356/csvtk/tree/master/testdata)食绿。
csvtk使用前注意
- csvtk處理時(shí)默認(rèn)會自動(dòng)保留表頭侈咕。認(rèn)為csv文件的第一行為header信息,如果沒有header器紧,需指定參數(shù)
-H
- 默認(rèn)是處理以
,
作為分割的csv文件耀销,處理\t tab
分割的tsv文件,指定參數(shù)-t
- csv文件默認(rèn)每行(rows)都有相同的列數(shù)(columns)铲汪,
-I/--ignore-illegal-row
跳過這些錯(cuò)誤行 - csv文件每列(columns)的名字不重復(fù)熊尉。
- 默認(rèn)會忽略
#
,指定header的符號-C
- 若每列中存在雙引號
""
掌腰,指定參數(shù)-1
文件基本信息(Information)
1. headers
只顯示表頭
2. dim
顯示csv文件的每行每列數(shù)目
3. summary
可根據(jù)分組信息(group_by)對每列(columns)進(jìn)行數(shù)學(xué)統(tǒng)計(jì)
類似于R中dplyr包中的summary函數(shù)狰住,其中對數(shù)字進(jìn)行的數(shù)學(xué)統(tǒng)計(jì)包括countn(統(tǒng)計(jì)數(shù)字有多少), min, max, sum, mean, stdev, variance, median, q1, q2, q3, entropy, prod,對字符文本的包括:count(計(jì)數(shù)), first, last, rand(隨機(jī)取值), uniq(去重), collapse(轉(zhuǎn)為以;的一行信息), countunique(uniq之后計(jì)數(shù)有多少)〕萘海基本用法:csvtk summary -f 2:sum
-
-f 2/column_name2:sum/mean...
指定第幾列進(jìn)行統(tǒng)計(jì)催植,可進(jìn)行多列統(tǒng)計(jì)。 -
-i
忽略列中的非數(shù)字缺失值NA -
-g
類似于dplyr中的group_by勺择,根據(jù)某列進(jìn)行分組統(tǒng)計(jì)创南。 -
-n 2
保留幾位小數(shù) -
-S 11
設(shè)置隨機(jī)種子 -
-s ;
設(shè)置collapse的為一列時(shí)的分割符號
## 第四列 總和
cat digitals2.csv | csvtk summary -f f4:sum
## 多列進(jìn)行計(jì)算,忽略NA
cat digitals2.csv | csvtk summary -f f4:sum,f5:sum -i
cat digitals2.csv | csvtk summary -f 4:sum,5:sum -i
## 分組統(tǒng)計(jì)
cat digitals2.csv | csvtk summary -i -f f4:sum,f5:sum -g f1,f2 | csvtk pretty
## 去第一行header
cat digitals2.csv|csvtk summary -f 4:sum -f 5:sum -i -g 1,2|sed 1d
## 分組統(tǒng)計(jì)多個(gè)信息:
cat digitals2.csv | csvtk summary -i -g f1 -f f4:countn,f4:mean,f4:stdev,f4:q1,f4:q2,f4:mean,f4:q3,f4:min,f4:max
cat digitals2.csv | csvtk summary -i -g f1 -f f4:collapse,f4:max|csvtk pretty
格式轉(zhuǎn)變
1. pretty
方便閱讀的展示方式省核。
-
-r
靠右對齊 -
-s
指定分割符號 " | "
2. transpose
對數(shù)據(jù)進(jìn)行轉(zhuǎn)置稿辙,行列轉(zhuǎn)換
3. space2tab
以空格分割的轉(zhuǎn)為tab分割的。
4. csv2md
csv/tsv轉(zhuǎn)變?yōu)閙arkdown格式气忠。
5. csv2json
csv轉(zhuǎn)變?yōu)閖son格式
6. xlsx2csv
對EXCEL的xlsx文件轉(zhuǎn)換為csv文件
-
-a
顯示所有的附表sheets -
-i 2
對第幾個(gè)附表進(jìn)行操作邻储。csvtk xlsx2csv accounts.xlsx -i 3
-
-n
根據(jù)附表的名字進(jìn)行提取赋咽。
集合操作 set operation
1. head
顯示前n行,包括表頭header
2. concat
concatenate吨娜。對多個(gè)tsv/csv表根據(jù)表頭columns對行rows合并脓匿。
只保留第一個(gè)表的header,類似于dplyr中的left_join()
萌壳。
-
-i
每個(gè)表的表頭column_name忽略大小寫亦镶。 -
-u NA
未匹配到的空的數(shù)據(jù)以任意"NA"表示 -
-k
保留未匹配到合并的數(shù)據(jù),以-u
字符表示
## 合并col_names相同的表
csvtk concat names.csv names.reorder.csv |csvtk pretty
## 忽略大小寫袱瓮,保留空的行缤骨,以"NA"表示
csvtk concat names.csv names.with-unmatched-colname.csv -i -u NA | csvtk pretty
3. sample
隨機(jī)取一定比例的行數(shù)
-
-p 0.1
取的比例 -
-s 10
設(shè)置隨機(jī)種子,默認(rèn)11尺借。seq 100 | csvtk sample -H -p 0.1 -s 1
-
-n
顯示隨機(jī)的行rownames名绊起,
4. cut
取指定列columns,
類似于dplyr中的select
燎斩,或者linux中進(jìn)階的cut
虱歪。
-
-f 1,2 || colA,colB
根據(jù)數(shù)字 or col_name來選指定列≌け恚可反選-f -1,-2
-
-i
忽略col_name中的大小寫 -
-F
允許部分正則匹配*name
## 根據(jù)表頭column名進(jìn)行挑選
cat names.csv |csvtk cut -f first_name,username
## 選第2~4列
cat names.csv | csvtk cut -f 2-4
## 反選笋鄙,即除了第一,二列
cat names.csv | csvtk cut -f -1,-2
cat names.csv | csvtk cut -f -username
## 允許部分正則匹配的 *
cat names.csv | csvtk cut -f "*_name"
5. uniq
對指定多列自動(dòng)排序去重復(fù)
等同于Linux中的sort | uniq
6. freq
對指定列去重復(fù)怪瓶,順便計(jì)數(shù)排序萧落。
等同于Linux中的sort |uniq -c
。-f
,-F
,-i
同cut
子命令
-
-n
根據(jù)計(jì)數(shù)從小到大排序 -
-k
根據(jù)名字key排序 -
-r
反過來
### 對第二列排序洗贰,并按照frequency的數(shù)值從大到小排列
cat names.csv |csvtk freq -f 2 -nr
7. inter
多個(gè)文件之間的交集找岖。
-f
, -F
, -i
等同于cut
子命令。
8. grep
對指定列進(jìn)行key的正則匹配提取
類似于dplyr中的filter()
函數(shù)對某column的字符串chr進(jìn)行匹配操作敛滋。
-
-f
指定列的col_name许布,1-3列 -
-p pattern
搜索提取的pattern -
-P
提取pattern的文件,多個(gè)pattern進(jìn)行提取 -
-i
忽略大小寫 -
-v
反向匹配绎晃。 -
-r
支持正則匹配 -
-n
顯示提取的行號蜜唾。
cat names.csv | cavtk grep -f 1 -ir -p rob |csvtk pretty
## 對names.csv的first_name隨機(jī)取幾個(gè)名子作為file,再對names.csv文件根據(jù)文件進(jìn)行提取
cat names.csv |csvtk cut -f 3 |sed 1d|csvtk sample -p 0.5 -H| csvtk grep -f 3 -ir -P - names.csv |csvtk pretty
9. filter
利用數(shù)學(xué)公式庶艾,對指定列進(jìn)行數(shù)值的過濾提取袁余。
類似于dplyr中的filter()
函數(shù)對數(shù)值的處理方式。
-
-f 1,2>0
對指定列進(jìn)行數(shù)值的過濾 -
--any
多列進(jìn)行過濾落竹,滿足任意一列條件皆保留。 -
-F
,-n
## 第1~3列任意列大于0即保留货抄。
cat digitals.tsv | csvtk -t -H filter -f "1-3>0" --any
10. filter2
類似于awk的數(shù)據(jù)過濾方式述召。
支持awk中的數(shù)值/表達(dá)式朱转,按指定多列的數(shù)值進(jìn)行過濾。
## id列大于3
cat names.csv | csvtk filter2 -f '$id > 3'
## id列大于3 或 username列 為 "ken"
cat names.csv | csvtk filter2 -f ' $id > 3 || $username == "ken" '
## other arithmatic expressions
cat digitals.tsv | csvtk filter2 -H -t -f '$1 > 2 && $2 % 2 == 0'
cat digitals.tsv | csvtk filter2 -H -t -f '$2 <= $3 || ( $1 / $2 > 0.5 )'
11. join
對多個(gè)文件按指定列進(jìn)行合并积暖。
類似concat藤为?或者dplyr中的left_join()
-
-f
按第一個(gè)文件指定列進(jìn)行合并,文件中的col_name名不用完全相同夺刑。若指定匹配的列 以-f "colA_1;colB_2"
表示缅疟。 -
-k -fill NA
保留未匹配的,以NA表示遍愿。
csvtk join {1,2,3}.csv -f name -k
csvtk join {3,1,2}.csv -f name -k
12. split
根據(jù)指定column的value進(jìn)行分割文件存淫。
-
-f 1~3 || columnA
指定列以factor方式分割文件 -
-o
對分割的文件指定輸出文件夾
### 根據(jù)first_name, last_name分割文件
csvtk split names.csv -f first_name,last_name
### 分割輸出到result文件夾
seq 100 | csvtk split -H -o result
13. splitxlsx
類似于split,對xlsx表內(nèi)按照列column進(jìn)行分割出多個(gè)文件沼填。
文件的內(nèi)容編輯相關(guān)
1. add-header
添加列的名字桅咆。-n a,b,c
2. del-header
刪除列的名字
3. rename
對column名修改
-
-f 1,2
指定列進(jìn)行改名 -
-n a,b
對指定列進(jìn)行改名。
## 對A,B列進(jìn)行改名
cat phones.csv | csvtk rename -f A,B -n a,b | csvtk pretty
4. rename2
正則匹配來對指定多列名進(jìn)行修改坞笙。
類似于dplyr中的rename_all() iris %>% rename_all(tolower) %>% rename_all(~str_replace_all(., "\\.", "_"))
-
-f
指定列進(jìn)行修改岩饼。 -
-p
正則匹配的字符。 -
-r
修改過后的字符薛夜。'${1}'的使用 '{nr}', '{nk}' -
-k
按照指定key-value的文件進(jìn)行改名籍茧。 -
-K
保留-k中未匹配的到的列名
### 對所有的列名進(jìn)行修改,添加prefix_${1}_suffix
cat phones.csv | csvtk rename2 -F -f "*" -p '(.*)' -r 'prefix_${1}_suffix'
### 根據(jù)barcodes的key-value對應(yīng)關(guān)系 來 對tables.tsv進(jìn)行改列名梯澜。
csvtk cut -t barcodes.tsv -f 2,1 | csvtk rename2 -t -F -f "*" -k - -p '(.+)' -r '{kv}' -K tables.tsv
### 改列名利用增長的1~n
echo "a,b,c,d" | csvtk rename2 -f 2-4 -p '(\w+)' -r 'seq_{nr}' --start-num 2
5. replace
根據(jù)正則匹配對指定多列進(jìn)行替換編輯
類似于rename的一些操作寞冯。
-
-F -f "*"
指定所有列 -
-p pattern
正則匹配的pattern -
-r
替換的string,支持${1}自動(dòng)捕獲腊徙,{nr}简十,{nk} -
-k
可根據(jù)key-value的文件進(jìn)行批量替換 -
-K
-k中保留未匹配的文字。
###刪除文件中的漢字
csvtk replace -F -f "*_name" -p "\p{Han}+" -r ""
### 根據(jù)key-value的文件進(jìn)行匹配替換撬腾,時(shí)刻記住處理tsv文件加參數(shù) -t
csvtk replace -t -f 2 -p 'ID(\d+)' -r '{kv}' -K -k alias.txt data.tsv
6. mutate
根據(jù)正則匹配創(chuàng)建新的一列
類似于dplyr中的mutate()
-
-f
指定列,-i
ignore case -
-p pattern
對列的內(nèi)容 利用正則匹配捕獲 -
-n
添加新列的新的名字
### 復(fù)制新列
csvtk mutate -f id -n newname
### 對username列 的第一個(gè)字母進(jìn)行匹配螟蝙,以新列展示
cat phones.csv | csvtk mutate -f 1 -p '^(\w)' -n 'first_name' | csvtk pretty
7. mutate2
類似于awk的方式創(chuàng)建新的列
-
-e
awk類似的表達(dá)式, 連接民傻,數(shù)值的相加等~ -
-L 2
數(shù)值計(jì)算時(shí)胰默,默認(rèn)保留2位小數(shù)。 -
-s
將數(shù)值num當(dāng)字符chr
### 添加新列
cat digitals.tsv |csvtk mutate2 -t -H -e ' "a" '
### 添加新列漓踢,自建變量
var=123
cat digitals.tsv |csvtk mutate2 -t -H -e "$var"
### 兩列進(jìn)行連接
cat names.csv | csvtk mutate2 -n full_name -e ' $first_name + " " + $last_name'
### 數(shù)值的相加
cat digitals.tsv | csvtk mutate2 -t -H -L 0 -e ' $1 + $2 '
### 相比較
cat digitals.tsv | csvtk mutate2 -t -H -L 0 -e ' $1 >5 ? "big":"small" '
8. gather
表格的整理
類似于tidyr中的gather()
函數(shù)牵署,對相同的列數(shù)據(jù)進(jìn)行整理。
cat names.csv | csvtk gather -f -1 -k name -v value
排序
sort
對指定列 排序
-
-i
忽略大小寫 -
-k
對指定列排序-k 1:N/n/u/r
### 對指定列排序
cat names.csv | csvtk sort -k first_name | csvtk pretty
### 對指定列倒序
cat names.csv | csvtk sort -k first_name:r | csvtk pretty
### 對指定列按數(shù)值排序,倒序
cat names.csv | csvtk sort -k first_name:nr | csvtk pretty
### 按自然順序排序N
echo "X,Y,1,10,2,M,11,1_c,Un_g,1_g" | csvtk transpose | csvtk sort -H -k 1:N
### 按多列進(jìn)行排序
cat names.csv | csvtk sort -k first_name -k id:n
plot
畫一些通常的直方圖喧半,箱線圖奴迅,散點(diǎn)圖。
csvtk plot hist
csvtk plot box
csvtk plot line
足夠強(qiáng)大的工具挺据!推薦學(xué)習(xí)使用取具!