学生信的那些事儿之八 - Linux基础之编辑器:sed & gawk

Shell脚本最常见的用途就是文本处理,但是想要处理更多类型的数据,sed和gwak工具是不得不学的。没有真正的处理实际的组学数据实操示例就说这两个工具多么多么重要,总感觉有些空洞。这个比较尴尬,因为直接开始处理组学肯定更是云里雾里,不知从何下手。每一行都讲究基本功,有一段时间学街舞(当然是半途而废了),老师在很长时间就是教一些特别枯燥无聊,而且重复性很高的动作。要求我们一直练,练到像吃饭拿筷子一样自然,我们当然不开心,总想着赶快学会一套炫酷舞步,然后在心仪的妹子面前装逼一番。不过时间久了就明白了老师的苦心,后面的所谓编舞其实可以没有的,音乐响起后,跟着节奏,只需要把从前学过的"枯燥无聊"动作简单组合,就是非常有feeling的舞蹈。大概是一样的道理吧,先把各种会用到的工具学到家,真正面对数据的时候上手必然快。

sed编辑器

概念

sed编辑器是一种流编辑器(stream editor), 至于什么叫做"流",我也不是很确定,但是形象化的认知就是sed工具可以处理的数据。与之前提到的vim编辑器不同(交互式的,可直接对数据进行插入、删除或替换操作),sed是通过预先设定好的"一组规则"对数据流进行处理。

sed编辑器处理数据的流程(特点):

  1. 一次从输入中读取一行数据(处理单位是)
  2. 根据提供的编辑器命令匹配数据(会用到所谓的"规则")
  3. 按照命令修改数据流中的数据
  4. 将新的数据输出到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功能的冰山一角,更多的自己去学吧,更有乐趣些,网上有很多教程分享,当然看书更好喔~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容