生信人

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

0

收听

12

听众

278

主题
发表于 2022-7-5 12:04:12 | 查看: 632| 回复: 0
本帖最后由 生信喵 于 2022-7-5 12:09 编辑

一、软件介绍
        awk 是一个强大的文本处理工具,它不仅是 Linux 中,也是其他环境中现有的功能最强大的数据处理引擎之一。相对于 grep 的查找,sed 的编辑,awk 在其对数据分析并生成报告时,显得尤为强大。简单来说 awk 就是把文件逐行的读入,以空格为默认分隔符将每行切分,切开的部分再进行各种分析处理。awk 的名字来源于他的三个创始人,Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。
        为什么 awk 功能这么强大呢,因为 awk 本身就是一门编程语言,所以学习 awk 有一定的难度,这种编程及数据操作语言的最大功能取决于你所掌握的 awk 技能多少。也就是刚开始可能觉得 awk 没多少用处,awk 能够完成的工作,采用其他方法也都能完成,但是随着越来越熟悉 awk 的操作,就会发现,awk 处理文本如此的高效,几乎可以完成所有的文本处理。
        awk 有 3 个不同版本: awk、nawk 和 gawk,一般常用的就是 gawk,gawk 是 AWK 的 GNU 版本。我们这里演示的就是 gawk。
        awk 有三种执行方式,从只有一行代码解决问题到需要几千行代码都是 awk 的操作方式。
        第一种是 awk 命令行模式,像普通 linux 命令一样使用 awk,这也是我们最常用的一种方式,在命令行中也可以使用一些 awk 编程程序语言,但是不多。虽然 awk 支持多行的输入,但是命令行内容太多了,就不是命令行了,变成命令段落了,因此,awk 命令行一般只用于解决简单的问题。
        第二种是使用-f 选项调用 awk 程序。这个和 sed -f 的方法类似,awk 允许将一段 awk 程序写入一个文本文件,然后在 awk 命令行中用-f 选项调用并执行这段程序。当命令内容较多的时候,可以使用这种方法。
        第三种就编程模式,写一个 awk 脚本,利用命令解释器调用 awk 程序,这部分就复杂一些,相当于 awk 编程。这部分我们不常用,因为需要 awk 编程处理文本时,我都使用 perl 语言编程了,perl 处理文本更加高效。

二、使用案例
  1. #1:输出一个列表任意列;
  2. awk '{print $2}' blast6.out  | head
  3. awk '{print $NF}' blast6.out | head #number field 最后一列
  4. awk '{print $1,$3,$5}' blast6.out | head #逗号间隔多列
  5. awk '{print $1"\t"$3"\t"$5}' blast6.out | head #间隔多列

  6. #2 修改分隔符以及输出分隔符
  7. awk -F ":" '{print $1,$NF}' /etc/passwd
  8. awk -F ":" 'OFS="," {print $1,$NF}' /etc/passwd #OFS output field separator

  9. #3 过滤blast结果
  10. awk  '{if ($3>=80 && $4>=100) print $0}'  blast6.out

  11. #4 统计数目
  12. awk  '{if ($3>=80 && $4>=100) print $2}'  blast6.out | sort | uniq | wc

  13. #5 输出固定行内容
  14. awk 'NR>=20 && NR<=80' blast6.out #20行到80行

  15. #6 格式转换
  16. samtools view demo.bam  | awk '{print"@" $1"\n"$10"\n""+\n"$11""}' | gzip >demo.fq.gz

  17. #7 fastq转换fasta
  18. zcat demo.fq.gz | awk '{print NR":"$0}' | head
  19. zcat demo.fq.gz |awk '{getline l2;getline l3;getline l4;print $0 "\n" l2}' | head
  20. zcat demo.fq.gz |awk '{getline l2;getline l3;getline l4;sub("@",">",$0);print $0 "\n" l2}' | head

  21. #8 模式匹配
  22. awk '$0~ /usr/ {print $0}' /etc/passwd
  23. last -w | awk '$0 ~ /in/ {print $1}'

  24. #9 BEGIN与END功能
  25. awk 'BEGIN{print "The Program Begin\n"} $0 ~ /usr/ {print $0} END {print "The Program End\n"}' /etc/passwd

  26. #10 转为bed文件格式
  27. cat test.bed
  28. awk 'BEGIN{OFS="\t"} {print $1,$2,$3}' test.bed | cat -A

  29. #11 替换
  30. awk '{sub(/Escherichia coli str. K-12 substr. MG1655, complete genome/, " ", $0);print}' demo.fasta | grep ">" |head

  31. #12 计算占用CPU情况
  32. ps hux -U $USER | awk -v user=$USER '{ sum += $6} END { printf "%s %.2f\n", user,sum/100;}'
复制代码

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|生信人

GMT+8, 2024-4-30 02:48 , Processed in 0.034975 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表