34. 《Bioinformatics Data Skills》之awk文本处理

前面我们学习了基本的Unix表格文本数据的处理命令(grep, cut, sort, uniq等),但是在更加复杂的情况下这些命令使用起来就力不从心了。对表格数据进行更加复杂的操作可以使用awk脚本语言,这里介绍一下它的用法。

基本用法

awk的用法由两部分组成

  • record。awk专门处理表格文本,它将输入的文本的每一行会当作一个record,智能地将整行内容赋给变量$0,第一列赋给$1,第二列赋给$2,以此类推。

  • pattern { action }的模式进行匹配与操作。pattern为判断条件,类似其它语言if语句,满足pattern的行进行action操作;如果pattern被省略的话对每一行都进行action操作;如果action被省略的话会展示所有满足pattern的行。

action

example.bed文件为例,使用awk打印文本所有内容:

$ awk '{print $0}' example.bed
chr1    26      39
chr1    32      47
chr3    11      28
chr1    40      49
chr3    16      27
chr1    9       28
chr2    35      54
chr1    10      19

print $0操作可以省略$0

接着,我们可以使用awk模仿cut的操作(结果与cut -f2,3 example.bed一致):

$ awk '{print $2 "\t" $3}' example.bed
26      39
32      47
11      28
40      49
16      27
9       28
35      54
10      19

pattern

下面展示pattern的使用,比如说我们想要查看feature长度大于18的行:

$ awk '$3 - $2 > 18' example.bed
chr1    9       28
chr2    35      54

awk支持基本的数学运算例如+,-,*,/,%(取余)。

pattern支持逻辑操作(见表1):

表1

例如我们过滤得到1号染色体特征长度大于10的行:

$ awk '$1~/chr1/ $3 - $2 > 10' example.bed
chr1    26      39
chr1    32      47
chr1    40      49
chr1    9       28
chr1    10      19

组合pattern与action

通过组合pattern与action我们可以对特定的行进行操作,例如在染色体2或者3所在行添加特征长度信息:

$ awk '$1 ~ /chr[23]/ {print $0 "\t" ($3 - $2)}' example.bed
chr3    11      28      17
chr3    16      27      11
chr2    35      54      19

总结:以上我们已经学习了awk的基本用法,通过awk我们可以达到下面的两个基本目的:

  • 数据过滤
  • 添加新的列

awk进阶操作

awk有两个比较方便的进阶操作:

1. BEGIN与END

awk的pattern可以设为BEGINEND,代表在所有action开始之前与结束之后进行的操作,可以利用BEGIN进行变量的初始化,END进行总结。例如我们计算所有行特征长度的平均值。

$ awk 'BEGIN {s = 0}; {s+=($3 - $2)} END {print "mean: " s/NR}' example.bed
mean: 14

NR为内置变量,代表行数。

awk还有一些其它的内置函数见表2

表2 awk内置函数

关联向量

awk支持关联向量(可以像Python的字典一样存储变量),例如我们利用这点统计Mus_musculus.GRCm38.75_chr1.gtf文件(如下)中Lypla1基因不同的特征的数目:

$ grep -v "^#" Mus_musculus.GRCm38.75_chr1.gtf | head -n3
1  pseudogene              gene        3054233  3054733  .  +  .  gene_id  "ENSMUSG00000090025";  gene_name      "Gm16088";             gene_source  "havana";   gene_biotype  "pseudogene";
1  unprocessed_pseudogene  transcript  3054233  3054733  .  +  .  gene_id  "ENSMUSG00000090025";  transcript_id  "ENSMUST00000160944";  gene_name    "Gm16088";  gene_source   "havana";      gene_biotype  "pseudogene";  transcript_name  "Gm16088-001";  transcript_source  "havana";       tag                "cds_end_NF";  tag      "cds_start_NF";        tag  "mRNA_end_NF";  tag  "mRNA_start_NF";
1  unprocessed_pseudogene  exon        3054233  3054733  .  +  .  gene_id  "ENSMUSG00000090025";  transcript_id  "ENSMUST00000160944";  exon_number  "1";        gene_name     "Gm16088";     gene_source   "havana";      gene_biotype     "pseudogene";   transcript_name    "Gm16088-001";  transcript_source  "havana";      exon_id  "ENSMUSE00000848981";  tag  "cds_end_NF";   tag  "cds_start_NF";   tag  "mRNA_end_NF";  tag  "mRNA_start_NF";

命令为:

$ awk '/Lypla1/ {feature[$3] += 1}; \
END { \
for (k in feature) \
print k "\t" feature[k]\
}' Mus_musculus.GRCm38.75_chr1.gtf
exon    69
CDS     56
UTR     24
gene    1
start_codon     5
stop_codon      5
transcript      9

上面操作与下面的Unix命令操作得到的结果一致,不过使用awk可以方便地进行更加复杂的逻辑操作(例如通过&&添加),这是Unix命令无法比拟的。

$ grep -v "^#" Mus_musculus.GRCm38.75_chr1.gtf | cut -f3 | sort | uniq -c
  25901 CDS
   7588 UTR
  36128 exon
   2027 gene
   2290 start_codon
   2299 stop_codon
   4993 transcript

最后,虽然awk针对文本每行的处理非常方便,但是涉及到多行操作将变得复杂,这种情况建议优先使用R或者Python。

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

推荐阅读更多精彩内容