标题:awk命令的使用
作用:awk是非常好用的数据处理工具,主要处理每一行的字段内的数据,默认的字段的分割符为空格键或[tab]键
一、awk脚本的基本结构:
awk 'BEGIN{print "start"} pattern {commands} END{print "ends"}' file // 一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三部分是可选的,任意一部分都可以不出现在脚本中
//通常是被单引号或双引号括住的
例如: awk 'BEGIN{i=0}{i++}END{print i}' filename
awk "BEGIN{i=0}{i++}END{print i}" filename
二、awk的执行过程
awk 'BEGIN {commands} pattern{commands}END{commands}' filename
[1]第一步:执行BEGIN{commands} 语句块中的语句;
[2]第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{commands}语句块,它逐行扫描文件,第一行到最后一行重复这个过程,直到文件全部被读取完毕;
[3]第三步:当读至输入流末尾时候,执行END{commands}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块。比如变量的初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流读取完所有的行之后执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成。
三、awk内置变量
[1]$n 是当前行的按照指定域分隔符(默认是空格或[TAB]]键)分割后的第n个字段,比如n为1 表示第1个字段,n为2表示第2个字段
[2]$0 则是记录了执行过程中当前行的文本内容
[3]NF 每一行($0)拥有的字段总数
[4]NR 目前awk所处理的"第几行"数据
[5]FNR 表示当前所处理的文本内的"第几行"数据
[6]FS 目前的域分割符号,可以通过FS字段指定文本的域分割符
[7]OFS 输出字段的分割符(默认是一个空格)
[8]ORS 输出的记录分割符(默认是一个换行)
[9]ARGIND 命令行中处理的当前文件的位置(从1开始)
[10]ARGC 命令行参数的数目
[11]ARGV 命令行参数的数组
四、awk实例
例1:pay.txt文件内容格式:姓名、第一个月工资、第二个月工资、第三个月工资,将每一个人的三月工资总和计算出来
Name 1st 2nd 3th
VBird 2300 3400 2500
Bmtsai 2000 2000 2300
Bird2 4300 4200 4100
命令:awk 'NR==1{printf ("%10s%10s%10s%10s%10s\n", $1, $2, $3, $4,"Total")} NR>=2{total=$2+$3+$4; printf ("%10s%10s%10s%10s%10s\n", $1, $2, $3, $4,total)}' pay.txt
输出:
解释:NR表示当前处理的行数(行号),如果满足NR==1即处理的是第一行的内容Name 1st 2nd 3th,就执行后面的括弧中的打印(printf)命令;如果满足NR>=2那么就会执行第一个括弧中的命令{total=$2+$3+$4; printf
("%10s%10s%10s%10s%10s\n", $1, $2, $3, $4,total)}。所以,awk命令格式中的pattern决定了是否对当前输入的行执行其后面的commands。
例2:将a.dat的第一列内容和第二列内容相加
a.dat内容: b.dat内容:
命令: awk 'BEGIN{i=0;j=0}FNR==NR{array[i++]=$1;next}{total=array[j]+$1;print array[j],$1,total;j++}' a.dat b.dat
或awk 'BEGIN{i=0;j=0}ARGIND==1{array[i++]=$1}ARGIND==2{total=array[j]+$1;print array[j],$1,total;j++}' a.dat b.dat
输出结果:
解释:NR和FNR是awk内置变量,表示行号,NR表示处理的记录的行数,FNR表示当前处理的文件的行数,因为awk的参数可以同时跟多个文件名并且按照其出现的顺序逐个输入并处理,而NR 表示截止当前处理的总的行数,而FNR表示当前所处理的文
件的行数。能能够导致读入下一个输入行,并返回到脚本的顶部,这可以避免对当前输入行执行其他的操作过程。
例3:去除重复记录——假设某文件test.da记录如下:
命令:awk ' !a[$0]++{print $0}' test.da
输出:
解释:awk默认数组的初始值是0,当记录已经出现在的数组a中的时候,那么!a[$0]为假,所以就不会执行后面的print $0
Linux系统之文本格式化工具awk
Linux awk文本分析工具