1.awk
AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。
是shell中处理文本的三大利器之一。
2.awk 初接触
awk 是行处理器,对每行中按指定的分隔符分开的列进行相应的操作。
awk [options] 'script' var=value file(s)
2.1 $0
awk '{print $0,$1,$2}' test.file # $0:打印出每行的全部内容;$1:打印出每行的第一个字段;$2:打印出每行的第二个字段
(不指定分隔符FS的情况下,默认的分隔符‘ ’)
awk '{ sum += $1 }; END { print sum }'test.file #求所用行第一字段的总和
2.2 if 和正则表达式
awk -F "\t" 'BEGIN{OFS"\t"} {if($1~/tar.gz$/){print $0}}'
每一行之间的不同列按“\t” 分割,当第一字段匹配一tar.gz结尾时,输出这一行,且输出行也是以”\t“输出。
不匹配是!=
2.3 FS (指定字段的分隔符)和OFS(输出字段分隔符)
awk -F "::" '{print $1}’ test.file #指定分隔符 FS,打印第一字段
awk 'BEGIN{OFS=";"}{print $1,$2,$3}' test.file # 按指定的分隔符输出前三行,若写成 $0这表示输出整行
2.4 NR、NF和FNR
a. NR 表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,
因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。
awk '{print NR}' test.file #打印出文件的行号
b.FNR,处理多个文件时,可以理解为File Number of Record。
awk '{print FNR }' in1.file in2.file ... #打印出多个文件的行号,每个文件都是从第一行开始计数
awk '{print NR }' in1.file in2.file...#也是打印所有行号,但是第二个文件是接在第一个文件的后面开始编号的,后面的以此类推。
c.NF 表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。
可以理解为文件的所有列数
awk '{print NF}' test.file ## 统计文件的所有列数(按指定的分隔符)
2.5 -v 指定变量
赋值一个用户要使用的
awk -F'\t' -v sum=0 '{sum+=$2}END{print sum}' dit.txt ##指定一个sum变量,计算第二字段的总和
awk 求某列的平均值,使用变量的和NR:awk '{sum+=$1}END{print "Average = ",sum/NR}' test.txt
awk 求某列的最大值,使用变量和条件判断:awk 'BEGIN{max=0}{if ($1>max)max=$1 fi}END{print "Max =",max}' test.txt
awk 求某列的最大值,使用变量和条件判断:awk 'BEGIN{min=199999}{if($1<min)min=$1 fi}END{print "Min =",min}' test.txt
2.6 -f 从脚本中读取awk命令
2.7 BEGIN 和END
BEGIN里面的代码在awk执行之前被执行;END代码在awk对所有行执行完毕后再执行;
BEGIN{} 中可以指定分隔符,变量名,等等;END{}也可以指定分隔符,格式化输出等等;
awk 'BEGIN{print "########"}{print $0}END{print "---------"}' test.file #在testfile文件的前后打印字符
2.8 重定向
> :重定向,覆盖目标文件内容;
>>:追加,追加到目标文件后面
awk '/ggg/{print $0 > "tmp.file"}' test.txt # 把文件中匹配到ggg的行输出到tmp.file中;注意写在程序块中的重定向要加上双引号。
awk '/ggg/{print $0}' test.file > tmp.file#与上面的代码实现同样的功能。
2.9 管道符 |
awk '{print $1,$2 |"sort -r "}' test.txt #打印第一和第二字段,并按照原来的顺序反转打印出来
2.10 sort
-t sep 定义分割符号,默认位空格/tab
-k sum 定义第一个域
-n 数字排序,生序
-rn 数字排序,降序
-r 反转结果 ,结果位生序反转就为降序
2.11 关联数组
awk中强大的功能之一。数组使用字符串作为索引 。
关联数组的遍历需要使用特殊的for结构,语法如下:for ( elem in array) action
example:
2.12 内置函数
a.gsub函数
example:
将文件中将整个$ 0中用s替代r的ddd替换成xxx.
b.length函数
length函数返回没有参数的字符串的长度。length函数返回整个记录中的字符数。(是字符,包括空白字符)
example:
c.substr函数
截取字符串,用法:sbustr(strings,position,number)
例如取出下面文件中的ID
example:
d.split函数
awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中。
用法:split(strings,array,field separator);若不指定field separator,默认的分隔符是当前的FS。
example:
2.13 网上教程
http://awk.readthedocs.io/en/latest/index.html