awk基本参数解释
awk擅长于对文件按行操作,每次读取一行,然后进行相应的操作。
读取单个文件时的基本语法格式是
awk 'BEGIN{OFS=FS="\t"}{print $0, $1;}' filename
读取多个文件时的语法是
awk 'BEGIN{OFS=FS="\t"}ARGIND==1{print $0, $1;}ARGIND==2{}' file1 file2
awk后面的命令部分是用引号括起来的,可以单引号,可以双引号,但注意不能与内部命令中用到的引号相同,否则会导致最相邻的引号视为一组,引发解释错误。
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令,循环读取文件的每一行
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
a[$1]=1: 索引操作,类似于python中的字典,在ID map,统计中有很多应用。
-F 指定一个或者多个分隔符
多个分隔符 -F "[=\t]"或-F'[=\t]' 定义三个分隔符两个分隔符之间不需要分开
一个分隔符 -F:或者-F ":"
一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格
pengzw@super-server:~/reference/At$ awk -F "[=\t]" '$3 == "gene" {print$1"\t"$11"\t"$4"\t"$5}' Athaliana_167_TAIR10.gene.gff3|head -n 10
Chr1 AT1G01010 3631 5899
Chr1 AT1G01020 5928 8737
Chr1 AT1G01030 11649 13714
Chr1 AT1G01040 23146 31227
Chr1 AT1G01050 31170 33153
Chr1 AT1G01060 33379 37871
Chr1 AT1G01070 38752 40944
Chr1 AT1G01073 44677 44787
Chr1 AT1G01080 45296 47019
Chr1 AT1G01090 47485 49286
FS="[" ":]+" 以一个或多个空格或:分隔 ,+表示多个
[root@Gin scripts]# cat hello.txt
root:x:0:0:root:/root:/bin/bash
[root@Gin scripts]# awk -F [" ":]+ '{print $1,$2,$3}' hello.txt
root x 0
还有常用字符串函数等。
-f 指定脚本文件
awk -f script.awk file
BEGIN{
FS=":"
}
{print $1}
//效果与awk -F":" '{print $1}'相同,只是分隔符使用FS在代码自身中指定
IF语句
必须用在{}中,且比较内容用()扩起来
awk -F: '{if($1~/mail/) print $1}' /etc/passwd //简写
awk -F: '{if($1~/mail/) {print $1}}' /etc/passwd //全写
awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd //if...else...