如果对Unix基础命令行还不熟悉的可以参考小编写的另一篇Unix命令行入门
在这个基础上,小编将介绍其他的unix在生物信息学当中常用命令行,持续更新中~
cut(剪切选择)
基本语法如下:
cut -d ',' -f 2 file.txt
-d 后面跟的是分隔符,默认情况下是tab
-f后面跟的是需要提取的字段(列),也可以同时提取多列 如-f 2,3,4,也可以表示范围2-4
除了以字段方式提取,还可以用字节和字符方式提取
-f | 按字段位置提取(提取列) |
-c | 按字符位置提取 |
-b | 按字节位置提取 |
sort(排序)
基本语法如下:
sort -k3,3 file.txt
sort的选项繁多而且搭配也很多,在这里做简单总结
-t | 规定数据分隔符是什么,默认是空白分隔符 |
-k | 规定按照第几列排序,k3,3即按照第三列,k3,4 先看第三列再看第4列 |
-i | 不区分大小写排序 |
-n | 按照数字大小排序,默认排序是按照首字符的ASCII值(100先于20) |
-r | 默认是从小到大排序,这里会从大到小排序 |
-s | 稳定性排序,对于多次排序会保持前一次排序的结果不变 |
-u | 排序之后会进行去重 |
需要注意的一点是,对于选择不同的k,可以用不同的排序方式
比如 sort -k3,3nr, -k4,4 对于第三列的排序是按照数字大小逆序排序,则对于第四列的排序就是按照默认的顺序
uniq(去重)(对连续重复行)
由于uniq是对于连续的重复行才会进行去重,所以一般是与sort配合使用的如
cat file.txt | sort | uniq | head
uniq也有许多的选项可供选择,下面是简短总结
-i | 忽略大小写差异 |
-u | 仅仅显示非重复行 |
-d | 仅仅显示重复行 |
-c | 显示重复次数及重复行(包括仅重复一次的记1) |
-f N | 不对前N个字段进行去重(默认空白分隔符) |
-s N | 不对前N的字符进行去重 |
压缩与解压缩
对于单个文件或者目录的压缩使用bgzip或者gzip
bgzip file.txt
gzip file.txt
在Linux系统不解压只查看zip
zcat file.txt.gz
在Linux系统解压文件
gunzip file.txt.gz
对于多个文件的压缩,一般是将其转移到目录中然后压缩目录,具体需要用tar 来实现,但是tar的选项很多,可以等需要用到的时候查阅即可
alias(重命名指令)
对于一个复杂的指令但是后面我们需要经常用到,我们就可以采用alias进行重命名
(但是注意alias只会在本次终端起到作用,一旦关闭就失效,但是可以改脚本文件使其永久生效)
alias uc='uniq -c' #将uniq -c简写为uc,其实可以命名由多个管道结合的指令
alias #可以查看所有的命名的指令
csvcut(对于csv文件进行列选择)
虽然cut可以对任意的分隔符文件进行列选择,但是对于标准的csv文件使用csvcut的鲁棒性会更好一些,csvcut是属于csvkit的一个工具,使用之前要先下载csvkit
pip install csvkit
比方说这是一个csv文件:
name,city
Alice,New York
Bob,Los Angeles
Charlie,Chicago
name和city分别是列名
csvcut -c 1,2 data.csv #按照列索引选择列,当然也可以直接输入列名
csvcut -C 1 data.csv #按照列索引排除列(注意这里是大写C),仍然可以输入列名
csvcut -c name -n data.csv #查看列名与之对应的索引
csvcut -c 1--rename name=fullname #对列名进行重命名,前面的原始列名也可以通过索引代替
awk(powerful文本处理工具)
对于强大的awk(文本处理工具)小编另写了一篇教程,有兴趣的读者可以参考
sed(stream editor)流编辑器
sed又是一个非常强大的文本处理工具(和awk和grep并肩),之所以将sed称之为流编辑器是因为其会逐行读取文本然后执行相应操作然后立即输出该行操作之后的结果(默认在终端输出),那么sed的基本的语法结构如下
sed [options] 'command' input_file
下面对常用的option进行一个简单的总结:
-n | 仅仅显示被sed操作之后的行(比如有些行不满足正则表达式) |
-i | 将操作之后的结果不显示在终端而是直接更改文件 |
-e | 使得在同一个命令行中可以同时执行多个sed命令 |
-f | 从一个预先写好sed命令的文本文件中读取指令执行 |
Notes:首先-i的操作是由风险的,可能会失误覆盖原有数据,所以可以用
sed -i.bak 'command' file.txt
对文件先进行一个备份(默认文件名为 file.txt.bak)
其次呢,下面是使用-e来实现一个命令行多个sed指令的例子(此代码实现的具体功能在后面讲到)
sed -e 's/red/crimson/' -e '/brown/d' -e 's/$/,fruit/' data.txt
那么除了常用的选项,sed还有一些常用的命令如下(在匹配行的时候可以使用正则表达式,如果没有了解过的小伙伴可以参考小编写的正则表达式入门-CSDN博客哦~)
1. 替换(s命令)
基本语法:s/old_text/new_text/[flags]
其中根据flags将行中出现old_text的换为new_text,flags有以下两种
1. g(global全局),表示对于每一行的每一个old_text都进行替换
2.n(这里的n是代指整数哦~不要真的写n),表示对出现的第n个old_text进行替换
如下,表示对出现的所有apple全部替换为orange
echo "apple, apple, banana" | sed's/apple/orange/g'
2. 删除(d命令)
有两种使用方式,一种是d前直接加行号,表示删除该行,一种是前面加pattern(正则)表示删除满足pattern的行,如
sed '3d' file.txt # 删除file.txt的第3行
sed '/error/d' file.txt # 删除file.txt中包含"error"的行
3. 打印(p命令)
p命令一般有三种用法,第一种是在前面加行号表示打印第几行(那么其他行仍然输出,只是被选择的行会输出两次),第二种前面加pattern表示打印满足pattern的行,第三种是和-n选项配合使用,表示打印被操作的行,所以一般情况下p总是和选项-n一起出现的,否则难以观察到究竟那些行被打印两次,示例如下
sed -n '2p' file.txt
sed -n '/error/p' file.txt
4. 插入(i命令)
和之前的命令一样,仍然是可以加行号和符合pattern两种形式,表示在该行前面加入特定内容(重起一行而不是加在该行开头,同理追加命令(见其后))
基本语法是:sed ‘ni\new_text' file.txt (or) sed '/pattern/i\new_text' file.txt
下面是两个例子
sed '3i\This is a new inserted line' file.txt
# 在file.txt的第3行前插入一行文本
sed '/example/i\Here is additional info' file.txt
# 在file.txt中所有包含"example"的行前插入文本
5. 追加(a命令)
基本用法和i一致,表示在选中行后追加内容,不再赘述
6. 更改(c命令)
基本语法是:sed nc\replacement_text file.txt (or) sed /pattern/c\replacement_text file.txt
将选择的行整行替换为replacement_text内容
sed '3c\This is the replaced line' file.txt
# 将file.txt的第3行替换为指定文本
sed '/error/c\This line has been fixed' file.txt
# 将file.txt中所有包含"error"的行替换为指定文本
在介绍完基本sed基本语法之后,咱们再来看开始-e的命令在干什么
sed -e 's/red/crimson/' -e '/brown/d' -e 's/$/,fruit/' data.txt
#data.txt
apple,100,red
banana,200,yellow
cherry,150,red
date,50,brown
首先,将所有的red替换为crimson,其次将行内有brown的行删除,最后在每一行末尾加,fruit,所以最后执行结果是: (小小贴士:$在正则当中表示行尾,所以此替换其实是行尾追加内容,同理可以用^来实现行首追加内容哦~)
apple,100,crimson,fruit
banana,200,yellow,fruit
cherry,150,crimson,fruit
持续更新中哦~