表格处理awk

2022-10-25 19:27:03 浏览数 (3)

一、软件介绍

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 Beginn"} $0 ~ /usr/ {print $0} END {print "The Program Endn"}' /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 %.2fn", user,sum/100;}'

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

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

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

1 人点赞