生信喵 发表于 2022-7-5 12:04:12

表格处理awk

本帖最后由 生信喵 于 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:输出一个列表任意列;
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;}'
页: [1]
查看完整版本: 表格处理awk