前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >wk文本处理

wk文本处理

原创
作者头像
ruochen
发布2021-12-05 22:52:49
1.2K0
发布2021-12-05 22:52:49
举报

基本用法

awk的用法由两部分组成

  • record。awk专门处理表格文本,它将输入的文本的每一行会当作一个record,智能地将整行内容赋给变量$0,第一列赋给$1,第二列赋给$2,以此类推。
  • pattern { action }的模式进行匹配与操作。pattern为判断条件,类似其它语言if语句,满足pattern的行进行action操作;如果pattern被省略的话对每一行都进行action操作;如果action被省略的话会展示所有满足pattern的行。

action

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

代码语言:txt
复制
$ awk '{print $0}' example.bed
代码语言:txt
复制
chr1    26      39
代码语言:txt
复制
chr1    32      47
代码语言:txt
复制
chr3    11      28
代码语言:txt
复制
chr1    40      49
代码语言:txt
复制
chr3    16      27
代码语言:txt
复制
chr1    9       28
代码语言:txt
复制
chr2    35      54
代码语言:txt
复制
chr1    10      19

print $0操作可以省略$0

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

代码语言:txt
复制
$ awk '{print $2 "\t" $3}' example.bed
代码语言:txt
复制
26      39
代码语言:txt
复制
32      47
代码语言:txt
复制
11      28
代码语言:txt
复制
40      49
代码语言:txt
复制
16      27
代码语言:txt
复制
9       28
代码语言:txt
复制
35      54
代码语言:txt
复制
10      19

pattern

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

代码语言:txt
复制
$ awk '$3 - $2 > 18' example.bed
代码语言:txt
复制
chr1    9       28
代码语言:txt
复制
chr2    35      54

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

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

表1

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

代码语言:txt
复制
$ awk '$1~/chr1/ $3 - $2 > 10' example.bed
代码语言:txt
复制
chr1    26      39
代码语言:txt
复制
chr1    32      47
代码语言:txt
复制
chr1    40      49
代码语言:txt
复制
chr1    9       28
代码语言:txt
复制
chr1    10      19

组合pattern与action

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

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

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

  • 数据过滤
  • 添加新的列

awk进阶操作

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

1. BEGIN与END

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

代码语言:txt
复制
$ awk 'BEGIN {s = 0}; {s+=($3 - $2)} END {print "mean: " s/NR}' example.bed
代码语言:txt
复制
mean: 14

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

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

表2 awk内置函数

关联向量

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

代码语言:txt
复制
$ grep -v "^#" Mus_musculus.GRCm38.75_chr1.gtf | head -n3
代码语言:txt
复制
1  pseudogene              gene        3054233  3054733  .  +  .  gene_id  "ENSMUSG00000090025";  gene_name      "Gm16088";             gene_source  "havana";   gene_biotype  "pseudogene";
代码语言:txt
复制
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";
代码语言:txt
复制
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";

命令为:

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本用法
    • action
      • pattern
        • 组合pattern与action
        • awk进阶操作
          • 1. BEGIN与END
            • 关联向量
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档