python筛选csv数据_科学网—csvtk:命令行下表格统计分析、数据筛选、替换、整理神器 - 刘永鑫的博文...

如同生物信息领域中的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位系统。用户根据自己的系统自取。

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位版

介绍

基本信息工具类型: 命令行工具,子命令结构

支持格式: CSV/TSV, plain/gzip-compressed

编程语言: Go

支持平台: Linux, OS X, Windows 等

发布方式: 单一可执行二进制文件,下载即用

发布平台: Github, Bioconda

特性跨平台

轻量,无任何依赖,无需编译、配置,下载即用

快速

支持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为CSV

space2tab 转空格分割格式为TSV

transpose 转置CSV/TSV

csv2md 转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 histogram

plot box boxplot

plot line line plot and scatter plot

其它version   版本信息和检查新版本

genautocomplete 生成支持Bash自动补全的配置文件,重启Terminal生效。

使用输入数据要求每行的列数一致,空行也会报错

csvtk默认输入数据含有标题行,如没有请开启全局参数-H

csvtk默认输入数据为CSV格式,如为TSV请开启全局参数-t

输入数据列名最好唯一无重复

如果TSV中存在双引号"",请开启全局参数-l

csvtk默认以#开始的为注释行,若标题行含#,请给全局参数-C指定另一个不常见的字符(如$)

例子

下载软件和测序数据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

以上的内容是否能加速你的分析工作。

扩展阅读:

猜你喜欢

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。

学习扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值