linux || awk(3)

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...

你可能感兴趣的:(linux || awk(3))