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

表格处理awk

作者头像
生信喵实验柴
发布2022-10-25 19:27:03
5820
发布2022-10-25 19:27:03
举报
文章被收录于专栏:生信喵实验柴生信喵实验柴

一、软件介绍

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 处理文本更加高效。

二、使用案例

代码语言:javascript
复制
#1:输出一个列表任意列;
awk '{print $2}' blast6.out  | head
awk '{print $NF}' blast6.out | head #number field 最后一列
awk '{print $1,$3,$5}' blast6.out | head #逗号间隔多列
awk '{print $1"\t"$3"\t"$5}' blast6.out | head #间隔多列

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

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

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

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

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

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

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

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

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

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

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

写在最后:有时间我们会努力更新的。大家互动交流可以前去论坛,地址在下面,复制去浏览器即可访问,弥补下公众号没有留言功能的缺憾。原地址暂未启用(bioinfoer.com)。

代码语言:javascript
复制
sx.voiceclouds.cn

有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信喵实验柴 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档