awk数据处理整理

本文详细介绍了awk数据处理,包括字段变量(如$0、$1等)、内部变量(如FS、RS、OFS等)及其作用,以及自定义变量的创建。讲解了BEGIN和END模式的使用,正则表达式在模式匹配中的应用,还涵盖了awk中的运算符、条件表达式、控制语句(if、while、for等)以及数组操作。此外,还提到了awk的输出格式控制,如print和printf语句,以及内建函数的功能,如数学函数和字符串函数。
摘要由CSDN通过智能技术生成
基础知识
    1.基本程序结构

    awk 程序是由若干个“模式”与“动作”所组成的,其执行方式是针对文件中的每一行(line)搜索指定的模式 (patterns),当一行中有符合指定的模式,awk 就会在此一行执行被指定的动作(actions)。 awk 依此方式处理输入文件的每一行直到输入文件结束。
    “动作”一般写在大括号 “{ }” 里面,一个模式后面就跟着一个动作,一个动作可以是一条或多条语句。整个 awk 程式就象下面的形式:
awk  ‘ 模式 { 动作 }
     .................
        模式 { 动作 }’ filename
例如:awk 'BEGIN {FS="[,/]"}NR==FNR {a[$0]=$0}NR!=FNR && a[$2] {print $0}' b a
这种形式是从filename文件中读入数据
或者
`命令|awk ‘模式 { 动作 }
            ..............
            模式 { 动作 }’`        
是通过管道将命令的输出传递给awk语句。
   
例:awk ‘$1=”127.0.0.1” { print $2 }’ /etc/hosts  #从/etc/hosts中读入数据
而:cat  /etc/hosts| awk ‘$1=”127.0.0.1” { print $2 }’ #则是接收cat  /etc/hosts的结果
两个例子都是将/etc/hosts文件中所有第一个字段为127.0.0.1的行的第二个字段打印出来。
其运行结果为:localhost

    在 awk 中,“模式”或“动作”能够被省略,但通常是省略模式。模式被省略后, 对于输入文件里面的每一行,动作都会被执行。而如果“动作”被省略,awk语句只会去寻找你所指定的模式,但即使找到了也不执行其它任何操作(因为没有指定动作),就象在Unix系统中你用find命令去寻找一个文件,但是没有用 –print 参数来说明要显示一样,find只是找到了这个文件,但并不显示出来。
例如:awk '{print $1}' /etc/hosts   从/etc/hosts文件中读入数据,将每个记录(行)的第二个字段打印出来
awk ‘$1=”127.0.0.1”’ /etc/hosts 
只是在/etc/hosts文件中寻找,看看哪一行的第一个字段为127.0.0.1,不管找到与否,一概不显示。 所以结果是:什么都没有

执行awk文件:
vim a.awk
#!/bin/awk -f

vim a.sh
#!/bin/bash

变量


1)字段变量
awk处理数据时是逐行进行处理的,字段变量就是在处理过程中表示当前记录各字段的变量,其形式和含义如下:
$0: $0就是所处理的当前行(字符串)
$1: 当前行(记录)的第一个字段
$2: 当前行(记录)的第二个字段
$3: 当前行(记录)的第三个字段
………
如:  awk ‘{ print $1,”|”,$2 }’ /tmp/test
该语句将/tmp目录下的test文件的第一和第二个字段打印出来,字段间的分隔符为”|”.

2) 内部变量
awk的每次执行,都建立了一些缺省的变量,也叫做内部变量,这些变量有固定的名字和固定的含义,它们在程序运行期间可以随时被引用。其具体定义如下:
FS:    输入记录字段间的分隔符 field separate
RS:   输入记录的分隔符 row separate
OFS:  输出记录字段间的分隔符 out field separate
ORS:  输出记录的分隔符  out row separate

NR:   当前行数 num row
NF:   当前记录字段数  num field
ARGC: 命令行变元数 argc

 前四个内部变量在使用时一般用于设定你所需要的分隔副符,具体的使用方法如下例所示:
awk ‘BEGIN { FS=”|” ;OFS=”|” } #指明输入输出时都以“|”为字段间的分隔符
      { print $1,$2,…… }’ 文件名 
 
后面三个内部变量用于模式部分较多,在动作部分也有使用。
awk ‘ NR=10 { print $1,$2,…… }’ 文件名  #用于限定只对第十行进行处理。
awk ‘ BEGIN { SUM=0 }   #对SUM变量赋初值
     { SUM=SUM+NF }    #利用NF变量获得每行字段数的总和
      END { print “本文总共” SUM “个字段” }’ 文件名
 关于BEGIN和END的用法将在第三章介绍。

    3)自定义变量
在awk语言的任意动作区间,即在{}之内,均可随时定义变量,无须事先说明。但一般情况下是在BEGIN中定义变量并赋以初值,在动作区域内使用。
如:awk ‘BEGIN { sum=“0” } #定义变量sum,其初值为0
     { sum=sum+1 }   #对于每一条记录变量sum加1
            END { print sum }’ file0
 整条语句将计算出文件总的字段数。


全部环境变量
$n          当前记录的第n个字段,字段间由FS分隔。
$0          完整的输入记录。
ARGC        命令行参数的数目。
ARGIND      命令行中当前文件的位置(从0开始算)。
ARGV        包含命令行参数的数组。

CONVFMT     数字转换格式(默认值为%.6g)
ENVIRON     环境变量关联数组。
ERRNO       最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
FILENAME    当前文件名。
FNR         同NR,但相对于当前文件。
FS          字段分隔符(默认是任何空格)。
IGNORECASE  如果为真,则进行忽略大小写的匹配。
NF          当前记录中的字段数。
NR          当前记录数。

OFMT        数字的输出格式(默认值是%.6g)。
OFS         输出字段分隔符(默认值是一个空格)。
ORS         输出记录分隔符(默认值是一个换行符)。
RLENGTH     由match函数所匹配的字符串的长度。
RS          记录分隔符(默认是一个换行符)。
RSTART      由match函数所匹配的字符串的第一个位置。

SUBSEP      数组下标分隔符(默认值是\034)。


运算符
= += -= *= /= %= ^= **=    赋值
?:      C条件表达式
||      逻辑或
&&      逻辑与
~ ~!    匹配正则表达式和不匹配正则表达式
< <= > >= != ==            关系运算符
空格    连接
+ -     加,减
* / %   乘,除与求余
+ - !   一元加,减和逻辑非
^ ***   求幂
++ --   增加或减少,作为前缀或后缀
$       字段引用
in      数组成员


例如:
x^y x的y次幂 
x**y 同上 
x%y 计算x/y的余数(求模) 
x+y x加y 
x-y x减y 
x*y x乘y
x/y x除y 
-y 负y(y的开关符号);也称一目减 
++y y加1后使用y(前置加) 
y++ 使用y值后加1(后缀加) 
--y y减1后使用y(前置减) 
y-- 使用后y减1(后缀减) 
x=y 将y的值赋给x 
x+=y 将x+y的值赋给x 
x-=y 将x-y的值赋给x 
x*=y 将x*y的值赋给x 
x/=y 将x/y的值赋给x 
x%=y 将x%y的值赋给x 
x^=y 将x^y的值赋给x 
x**=y 将x**y的值赋给x


模式(pattern)
在一条“模式-动作”语句中,模式是一个表达式,用来确定执行相关操作的那些记录(行)。也就是在awk处理数据时,只有数据行与模式(pattern)相匹配,程序中相对应的动作(action)才会被执行。

BEGIN和END
BEGIN和END是两个特殊的模式。
BEGIN的作用是在处理第一条记录之前将BEGIN后面大括号之内的动作运行且只运行一次,也就是BEGIN匹配第一个输入记录之前。
END的作用是在处理完最后一条记录之后将END后面大括号之内的动作运行且只运行一次,也就是说,END匹配最后一个输入记录之后。

用表达式(Expression)作为模式
 一个awk模式可以是一个表达式,用这个表达式来测试两个数字或字串的诸如大于、等于、小于等关系。awk有六个关系操作符和两个匹配符:
x<y     如果 x 小于 y,则结果为真。
x<=y  如果 x 小于、等于 y,则结果为真。
x>y     如果 x 大于 y,则结果为真。
x>=y  如果 x 大于、等于 y,则结果为真。
x==y  如果 x 等于 y,则结果为真。
x!=y    如果 x 不等于 y,则结果为真。
x~y     如果 x 符合 正则表达式  y,则结果为真。
x!~y    如果 x 不符合 正则表达式  y,则结果为真。

上面所提到的 x 与 y,如果二者皆是数字则视为数字之间的比较,否则它们会被转换成字符串且以字符串的形式做比较。两个字符串的比较,会先比较第一个字符,然后比较第二个字符,依此类推&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值