学生信的那些事儿之八 - Linux基础之编辑器:sed &am
Shell脚本最常见的用途就是文本处理,但是想要处理更多类型的数据,sed和gwak工具是不得不学的。没有真正的处理实际的组学数据实操示例就说这两个工具多么多么重要,总感觉有些空洞。这个比较尴尬,因为直接开始处理组学肯定更是云里雾里,不知从何下手。每一行都讲究基本功,有一段时间学街舞(当然是半途而废了),老师在很长时间就是教一些特别枯燥无聊,而且重复性很高的动作。要求我们一直练,练到像吃饭拿筷子一样自然,我们当然不开心,总想着赶快学会一套炫酷舞步,然后在心仪的妹子面前装逼一番。不过时间久了就明白了老师的苦心,后面的所谓编舞其实可以没有的,音乐响起后,跟着节奏,只需要把从前学过的"枯燥无聊"动作简单组合,就是非常有feeling的舞蹈。大概是一样的道理吧,先把各种会用到的工具学到家,真正面对数据的时候上手必然快。
sed编辑器
概念
sed编辑器是一种流编辑器(stream editor), 至于什么叫做"流",我也不是很确定,但是形象化的认知就是sed工具可以处理的数据。与之前提到的vim编辑器不同(交互式的,可直接对数据进行插入、删除或替换操作),sed是通过预先设定好的"一组规则"对数据流进行处理。
sed编辑器处理数据的流程(特点):
- 一次从输入中读取一行数据(处理单位是行)
- 根据提供的编辑器命令匹配数据(会用到所谓的"规则")
- 按照命令修改数据流中的数据
- 将新的数据输出到STDOUT(标准输出)
语法
# 命令格式如下:
sed options script file
# options (选项)可选项有:
-e script 可从脚本中读取命令
-f file 可从文件中读取命令
-n 不产生命令输出,使用print命令完成输出
功能
1. 替换 ( substitute )
# 命令格式
sed 's/pattern/replacement/flags' text.txt
# 注释
pattern:需要被替换的原始内容,比如张三
replacement:原始内容被替换后的内容,比如李四,也就是说用李四替换张三,后面的替换前面的
命令格式最后一个正斜线后面有一个flags(标记),有4种替换标记可用:
-
数字,表示新文本替换第几处匹配的地方(以行为单位)
-
g,表示新文本会替换所有匹配到的文本
-
p,表明原先行的内容要打印出来
-
w file,将替换的结果写到文件中(像是重定向)
示例
这个就不写了吧~
2. 删除 ( delete )
# 命令格式
sed '3d' text.txt
# 注释
上面的命令是一个具体的命令,意思是删除text.txt文件中的第三行(3 delete)。
话已至此,不能不讲行寻址( line addressing )了,简单点说就是定位到哪一行。有两种寻址模式:以数字形式和文本模式。基本格式如下:
# 数字形式
[address]command, 比如:
sed '2s/cat/dog/' text.txt (表示将text.txt文本中第二行的cat替换为dog)
# 文本模式
/pattern/command, 比如:
sed '/Jude/s/cat/dog/' text.txt (表示将text.txt文本中含有Jude字符的一行中的cat替换为dog)
3. 插入( insert )和附加( append )文本
- 插入( insert )命令( i )会在指定行前增加一个新行;
- 附加( append )命令( a )会在指定行后增加一个新行;
命令格式如下:
sed '[address]command\new line'
# 示例
sed '3i\jude is a man' text.txt
# 上面的命令表示在text.txt文本中的第三行前面插入jude is a man;
# 附加命令一样一样的;
# 需要注意的是,这个命令里面的斜线是反斜线 '\',而不是正斜线 '/';
4. 修改( change )行
命令格式跟插入和附加一样,同样需要指定新一行的内容,而且这个修改命令是修改整行的内容。
sed '[address]command\new line'
# 示例
sed '3c\jude is a man' text.txt
# 上面的命令表示将text.txt文本中的第三行内容修改为jude is a man;
5. 转换命令( transform )
转换( transform )命令( y )是唯一可以处理单个字符的sed编辑器命令,格式如下:
[address]y/inchars/outchars/
# 转换命令是一对一的映射替换,同样是后者替换前者,而且是outchars中的第一个字符会替换inchars中的第一个字符,以此类推。例:
sed 'y/123/456/' text.txt
# 上例表示文本text.txt中的数字1,2,3会被分别替换为4,5,6.
gwak程序
sed编辑器固然好,gawk程序更加棒。gawk程序是Unix中原始awk程序的GNU版本(mac终端自带的是awk,要使用gawk得安装gawk包),其可以提供一个类似编程环境,从而修改和重新组织文件中的数据。也就是说它提供了一种编程语言而不仅仅是编辑器命令(传闻公司里有的生信前辈gawk玩的很溜,真的几乎都可以不用其他编程语言)。在gawk编程语言中可以实现如下操作:
- 定义变量来保存数据
- 使用算数和字符串操作来处理数据
- 使用结构化编程概念(if-then 和循环等)来为数据处理增加处理逻辑
- 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告(处理组学数据时这个经常会用)
命令格式
gawk options program file
# 可用选项(options)
-F fs 指定行中划分数据字段的字段分隔符
-f file 从指定的文件中读取程序
-v var=value 定义gawk程序中的一个变量及其默认值
-mf N 指定要处理的数据文件中最大字段数
-mr N 指定数据文件中的最大数据行数
用一个示例简单介绍下gawk的用法:
$ echo "my name is Jude" | gawk '{$4='Jude'; print $0}'
my name is Jude
$
# 注释
1. gawk命令格式必须得有 '{}',这是规矩,不解释,不争辩,接受就好
2. $4是一个变量,gawk一个很有意思的特征就是它会自动给一行中的每个数据元素分配一个变量,所以此处的$4表示这一行的第四
个元素,以此类推
3. 程序脚本中可以使用多个命令,用;隔开即可
4. print 是脚本定义的一个命令,会将文本打印到STDOUT
上面的介绍当然只是gawk功能的冰山一角,更多的自己去学吧,更有乐趣些,网上有很多教程分享,当然看书更好喔~