awk的用法由两部分组成
awk专门处理表格文本,它将输入的文本的每一行会当作一个record,智能地将整行内容赋给变量$0,第一列赋给$1,第二列赋给$2,以此类推。pattern { action }的模式进行匹配与操作。pattern为判断条件,类似其它语言if语句,满足pattern的行进行action操作;如果pattern被省略的话对每一行都进行action操作;如果action被省略的话会展示所有满足pattern的行。以example.bed文件为例,使用awk打印文本所有内容:
$ awk '{print $0}' example.bedchr1 26 39chr1 32 47chr3 11 28chr1 40 49chr3 16 27chr1 9 28chr2 35 54chr1 10 19print $0操作可以省略$0
接着,我们可以使用awk模仿cut的操作(结果与cut -f2,3 example.bed一致):
$ awk '{print $2 "\t" $3}' example.bed26 3932 4711 2840 4916 279 2835 5410 19下面展示pattern的使用,比如说我们想要查看feature长度大于18的行:
$ awk '$3 - $2 > 18' example.bedchr1 9 28chr2 35 54awk支持基本的数学运算例如+,-,*,/,%(取余)。
pattern支持逻辑操作(见表1):
表1
例如我们过滤得到1号染色体特征长度大于10的行:
$ awk '$1~/chr1/ $3 - $2 > 10' example.bedchr1 26 39chr1 32 47chr1 40 49chr1 9 28chr1 10 19通过组合pattern与action我们可以对特定的行进行操作,例如在染色体2或者3所在行添加特征长度信息:
$ awk '$1 ~ /chr[23]/ {print $0 "\t" ($3 - $2)}' example.bedchr3 11 28 17chr3 16 27 11chr2 35 54 19总结:以上我们已经学习了awk的基本用法,通过awk我们可以达到下面的两个基本目的:
awk有两个比较方便的进阶操作:
awk的pattern可以设为BEGIN或END,代表在所有action开始之前与结束之后进行的操作,可以利用BEGIN进行变量的初始化,END进行总结。例如我们计算所有行特征长度的平均值。
$ awk 'BEGIN {s = 0}; {s+=($3 - $2)} END {print "mean: " s/NR}' example.bedmean: 14NR为内置变量,代表行数。
awk还有一些其它的内置函数见表2
表2 awk内置函数
awk支持关联向量(可以像Python的字典一样存储变量),例如我们利用这点统计Mus_musculus.GRCm38.75_chr1.gtf文件(如下)中Lypla1基因不同的特征的数目:
$ grep -v "^#" Mus_musculus.GRCm38.75_chr1.gtf | head -n31 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.gtfexon 69CDS 56UTR 24gene 1start_codon 5stop_codon 5transcript 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原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。