awk备忘录

入门

awk的基本命令格式 awk 'pattern{action}',省略action时,默认action是{print},如awk '1'就是awk '1{print}'

介绍

  1. 和cut比较:cut也可以选择列,但不能重新排列,或计算新的值
# Cutting columns 1,3, and 4.
samtools view demo.bam | cut -f 1,3,4 | head

# With awk we can cut out and rearrange the columns
# and we can compute the actual likelihoods from the MAPQ quality 
samtools view demo.bam | awk '{ print $3, $2, $1, 10^(-$5/10) }'  | head
  1. awk如何工作
    awk 'CONDITION { ACTIONS }'
    awk 'CONDITION1 { ACTIONS1 } CONDITION2 { ACTIONS2 } CONDITION3 { ACTIONS3 }'
    比如,我们可以设定一个条件,输入的第5列要小于40,就打印
    samtools view demo.bam | awk '$5 < 60 { print $5 }' | head

  2. awk可能出现的问题
    大部分空格都可以识别,因为当制表符分隔的文件某一列为空时,会错位。因此最好每次都定义制表符分隔,或设置到bashrc中。
    awk -F '\t'
    alias awk="awk -F '\t'"

  3. 一些特定符号
    $0 原始的整行
    NF number of columns
    NR line number
    OFS output fields separator
    FNR file line number(如果在两个文档上运行,line number会在第二个文件的时候reset到1再开始)

最后一列 $NF

  1. BEGIN和END
    任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果
    samtools view -f 2 demo.bam | awk ' $9 > 0 { sum = sum + $9; count=count + 1 } END { print sum/count } '
    在结束运算后一次性输出
    但其实用datamash更简单
    samtools view -f 2 demo.bam | awk ' $9 > 0 { print $9 } ' | datamash mean 1
    awk还是仅仅只用来选择满足条件的行最好。

  2. 复杂的条件
    > or <: '$1 < 60 { print 41 }'
    ==, != :'{ $1 == "ORF" { print $1 }'
    ~, !~ 匹配或不匹配(正则表达式): ' $1 ~ "YALC|YALW" { print $1 }'
    匹配 pattern另一种方法是将pattern用/包围, 称为regexp constant: ' $1 ~ /YALC|YALW/ { print $1 }'

  3. 输出格式
    修改OFS,分隔符为制表符
    echo | awk '{ OFS="\t"; print 1,2,3 }'
    需要更精确的控制输出的话,就要用printf
    echo | awk '{ printf("%d %d %d",1,2,3) }'
    echo | awk '{ printf("A=%0.3f B=%d C=%03d",1,2,3) }'

A=1.000 B=2 C=003

  1. 更多学习
    Awk One-Liners one-liner awk scripts
    Awk One-Liners Explained an explanation for the one-line awk scripts
    Awk CheatSheet - a resource that lists all awk related variables
    Gnu Awk Manual - a comprehensive, but fairly complex resource

一些命令

屏幕快照 2017-10-30 上午10.12.36.png
  1. cat NC.gff | awk '{print $1,$2,$3}' | head -5

Chr1 TAIR10 chromosome
Chr1 TAIR10 gene
Chr1 TAIR10 mRNA
Chr1 TAIR10 protein
Chr1 TAIR10 exon

  1. cat NC.gff | awk '{print $3,$5-$4+1}' | head -5

chromosome 30427671
gene 2269
mRNA 2269
protein 1871
exon 283

  1. cat NC.gff | awk '$3 == "gene" {len=$5-$4+1;size+=len;print "Size:",size}'
    计算所有基因的累计长度
    一直累加,到最后一行是总和

Size: 61217607
Size: 61217680
Size: 61218118
Size: 61219702
Size: 61220038
Size: 61220156
Size: 61222091
Size: 61222409
Size: 61223024

  1. cat TAIR10_GFF3_genes.gff |awk '$3 == "chromosome"{len=$5-$4 + 1; size += len; print "Size:", size } '
    计算基因组长度(染色体累计长度)
  2. 根据特征(features)把文件分开。
    cat NC.gff | awk ' $3=="gene" { print $0 }' >> NC-genes.gff
    cat NC.gff | awk ' $3=="CDS" { print $0 }' >> NC-cds.gff
  3. sam文件是tab分隔的,也可以用awk操作
    上周的数据中,有多少碱基被覆盖了超过50次?
    samtools depth ../lec16/results.bam | awk '$3 > 50 { print $0 } ' |wc -l
    有多少的模板长度超过50 bp。
    samtools view ../lec16/results.bam | awk ' $9 > 50 { print $0 } ' | wc -l
  4. 基因,基因名称和长度
cat NC.gff |awk '$3 == "gene" 
  {split($9, x, ";"); ## 第九列,按分号分割
 split(x[1],  y,  "="); ##取第一列,并再次按等号分割
name = y[2];##取第二列
 gsub("\"", "", name); #不懂意思:用空格全局替换 " 符号,因为双引号是特殊字符,使用转义
 print $3, name, $5 - $4 + 1 } '

gene ATMG01310 411
gene ATMG01320 5216
gene ATMG01330 384
gene ATMG01340 73
gene ATMG01350 438
gene ATMG01360 1584
gene ATMG01370 336
gene ATMG01380 118
gene ATMG01390 1935
gene ATMG01400 318
gene ATMG01410 615

  1. 提取需要的信息
  • 初始将分隔符设定为制表符
  • 如果是第一行,打印行名称
  • 第3行开始,如果20列不是等号,且不以井号开始,打印多列
  • 输出

awk 'BEGIN{OFS="\t";}
{if(FNR==1) print "target_name\taccession\tquery_name\tquery_start\tquery_end\tstrand\tscore\tEvalue";
if(FNR>2 && 20!="=" &&0!~/^#/)
print 2,3,4,10,11,12,17,18; }'
my-genome.tblout >my-genome.tblout.final.xls

  1. 去重复
    对于awk '!a[$3]++',需要了解3个知识点
  • awk数组知识
  • awk的基本命令格式 awk 'pattern{action}',省略action时,默认action是{print},如awk '1'就是awk '1{print}'
  • var++的形式:先读取var变量值,再对var值+1

以数据

1 2 3
1 2 3
1 2 4
1 2 5

为例,对于 awk '!a[$3]++'

  • awk 处理第一行时: 先读取a[$3]的值再自增,a[$3]a[3]值为空(0),即为awk '!0',即awk '1',即awk '1{print}'
  • awk 处理第二行时: 先读取a[$3]值再自增,a[$3]a[3]值为1,即为awk '!1',即awk '0',即awk '0{print}'
  1. ls | awk -F "." '{print $1}'|xargs -I '{}' mv ./{}.sh ./{}.txt

匹配sh后缀,替换成txt

  1. awk 'NR>=31&&NR<=35'

  2. awk -F " " '{$1="";print $0}'
    去除第一列,输出第二列到最后一列

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

推荐阅读更多精彩内容

  • sed工具简介 用法:sed [-nefri] 动作参数:-n:使用安静模式(Silent)模式,一般在sed的...
    Bloo_m阅读 991评论 0 1
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,181评论 2 25
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,541评论 0 4
  • sed与awk实例 文本间隔 在每一行后面增加一空行 将原来的所有空行删除并在每一行后面增加一空行。这样在输出的文...
    stuha阅读 1,873评论 0 21
  • awk命令的基本使用 [root@shellscript ~]# head -n 3 /etc/passwd | ...
    古寒飞阅读 1,056评论 0 2