L i n ux常用命令之awklinux教程http://ww w.linuxprob e.c o m/
标题 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} ' filenameawk "BEGIN{i=0} {i++}END{print i} " filename
二、 awk的执行过程awk 'BEGIN {commands} pattern{commands}END{commands} ' f ilename
[1]第一步执行BEGIN{commands}语句块中的语句
[2]第二步从文件或标准输入stdin读取一行然后执行pattern{commands}语句块它逐行扫描文件第一行到最后一行重复这个过程直到文件全部被读取完毕
[3]第三步 当读至输入流末尾时候执行END{commands}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行这是一个可选的语句块。 比如变量的初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流读取完所有的行之后执行 比如打印所有行的分析结果这类信息汇总都是在END语句块中完成。
三、 awk内置变量
[1] $n是当前行的按照指定域分隔符默认是空格或[T AB] ]键分割后的第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]ARG IN D命令行中处理的当前文件的位置从1开始
[10]AR G C命令行参数的数目
[11]AR GV命令行参数的数组
四、 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;printarray[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教程http://www. linuxprobe. com/
tmhhost放出了2021年的端午佳节+618年中大促的优惠活动:日本软银、洛杉矶200G高防cn2 gia、洛杉矶三网cn2 gia、香港200M直连BGP、韩国cn2,全都是高端优化线路,所有这些VPS直接8折,部分已经做了季付8折然后再在此基础上继续8折(也就是6.4折)。 官方网站:https://www.tmhhost.com 香港BGP线路VPS ,200M带宽 200M带...
WordPress经典外贸企业建站主题,经典配色扁平化简约设计+跨屏自适应移动端设备,特色外贸企业建站功能模块+在线Inquiry询单功能,更有利于Google等英文搜索优化和站点收录。采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera等;同时支持移动终端的常用...
georgedatacenter这次其实是两个促销,一是促销一款特价洛杉矶E3-1220 V5独服,性价比其实最高;另外还促销三款特价vps,georgedatacenter是一家成立于2019年的美国VPS商家,主营美国洛杉矶、芝加哥、达拉斯、新泽西、西雅图机房的VPS、邮件服务器和托管独立服务器业务。georgedatacenter的VPS采用KVM和VMware虚拟化,可以选择windows...