csvtk——CSV_TSV文本處理萬能工具

寫在前面

能干什么吞歼? 學(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,-icut子命令

  • -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 指定列,-iignore 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í)使用取具!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脖隶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暇检,更是在濱河造成了極大的恐慌产阱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件块仆,死亡現(xiàn)場離奇詭異构蹬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悔据,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門庄敛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜜暑,你說我怎么就攤上這事铐姚。” “怎么了肛捍?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵隐绵,是天一觀的道長。 經(jīng)常有香客問我拙毫,道長依许,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任缀蹄,我火速辦了婚禮峭跳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缺前。我一直安慰自己蛀醉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布衅码。 她就那樣靜靜地躺著拯刁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逝段。 梳的紋絲不亂的頭發(fā)上垛玻,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音奶躯,去河邊找鬼帚桩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘹黔,可吹牛的內(nèi)容都是我干的账嚎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼郭蕉!你這毒婦竟也來了乏悄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恳不,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后开呐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烟勋,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年筐付,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卵惦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓦戚,死狀恐怖沮尿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情较解,我是刑警寧澤畜疾,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站印衔,受9級特大地震影響啡捶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奸焙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一瞎暑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧与帆,春花似錦了赌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茶凳,卻和暖如春嫂拴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贮喧。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工筒狠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箱沦。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓辩恼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子灶伊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容