最近学习了AWK的基本操作。以下是我整理的学习笔记。
以grade.txt为测试数据,共7个字段,内容如下
基本的命令行:awk -(选项) ‘{操作动作}’文件名
*************************************************************
1.
以 $n显示列,$1表示第一列,$2表示第二列,$0表示所有的列,
print 表示打印:awk ‘{print $0}’grade.txt 打印grade文件的所有列
2.
以下是awk中的一些内置变量和内置函数
2.1
-V 赋值作用,写在引号前
awk -v rest=100 '{ print $1,$7*rest}' grade.txt
申明一个变量rest ,并赋值100,然后打印第一个字段,第七个字段*rest的值
2.2
-F表示FS字段的分隔符,默认为空格
grade2.txt 以#为分隔符
awk -F "#" '{ print $1, $2,$3}' use-f.txt
用-F设置分隔符
2.3
如果数据中的各列用2个以上的分隔符。比如文件use-f.txt
用|来分别设置多个分隔符
awk -F "##|*%|sq" '{ print $1,$2,$3,$4}' use-f.txt
2.4
FIELDWIDTHS 以空格分隔的字段宽度
awk 'BEGIN{FIELDWIDTHS="3 6 9 12"}{ print $1,$2,$3,$4}' use-f.txt
2.5
FILENAME 当前正在处理的文件名,该变量不能在BEGIN块中使用
2.6
FNR 当前处理的记录号
awk '{print FNR,$1}' grade.txt
打印记录号和第一个字段
2.7
IGNORECASE 如果该变量设置为非0值,在进行字符串匹配时忽略大小写
2.8
NF 当前记录中的字段个数
NR 已经读出的记录数
awk '{print NF,NR}' grade.txt
打印记录数和总字段数
2.9
OFS 输出的字段分隔符,默认为空格
输出以#为分隔符的3个字段
awk 'BEGIN{OFS="#"} {print $1,$2,$3}'grade.txt
2.91
ORS
输出的行分隔符
awk 'BEGIN{ORS="*"} {print $1}' grade.txt
RS
输入的行分隔符
3. 字符串函数
3.1
index(s,t)函数返回目标字符串s中查询字符串t的首位置
awk '{print $1,index($1,”Tan”)}' grade.txt返回第一个字段中Tan出现的位置
3.2
length函数返回字符串s字符长度
awk '{print $1,length($1)}' grade.txt 显示第一个字段的长度
3.3
substr(3个参数)截取字符串
awk '{print $1,substr($1,1,2)}' grade.txt从第1个字段的第1个字符开始截取2个字符
3.4
substr(p,n) 截取字符串这种形势是2个参数的,返回字段P的第n个字符开始到字符结尾的所有字符串
awk '{print $1,substr($1,3)}' 显示第一个字段中从第三个字段开始到结尾的所有字符
*******************************************************************************
4.
比较操作符
<小于 >大于 ==等于!=不等于 ~匹配正则表达式!~不匹配正则表达式
= += *= /= %= 为赋值操作
|| && 等同于 and和 or
几个实例
4.1
awk ‘{if (FNR>=2 && FNR<=4){print $0}}’打印出第2到4行
4.2
awk '{if ($4=="yellow") || $7〉30} {print $0}}'grade.txt
打印出第4个字段等于yellow或者第七个字段大于30的记录
4.3
awk ‘{if (FNR %2 != 0) {print $0}}’ grade.txt
隔行打印
******************************************************************************
5.
模式
包括BEGIN 和 END
5.1
BEGIN发生在浏览记录之前。可以处理初始化的代码,用于赋值或者打印头部
awk 'BEGIN{print "Name\tBelt\n*************"}{printf "%-10s %-10s\n", $1,$3}' grade.txt
5.11
也可以在BEGIN模块中定义和初始化变量
awk 'BEGIN{rest =100}{print $1,$7*rest}' grade.txt
5.2
ENDawk还提供了另一个特殊块,叫作END块。awk在处理了输入文件中的所有行之后执行这个块
5.21
END计算最终总和。
awk '{sumof7=sumof7+$7}END {print sumof7}' grade.txt
计算第七列的总和
5.22
关于数组的一个使用
如果第一列的NAME中有重复的值,现在要统计每个唯一NAME的第七列的总和,使用数组和END来操作
awk ‘{aa[$1]=a[$1]+$7}END{for(k in aa) print k,aa[k]}’grade.txt
awk 'BEGIN{rest=100}{if $7>30 aa[$1]=aa[$1]+$7}END{for(k in aa) print k,aa[k]+100}' grade.txt
5.3
BEGIN和END一起用,首先在BEGIN中定义变量rest,并赋值100,然后先选择第七个字段大于30的记录,在汇总出唯一NAME的第七个字段的总和并加上rest的值
6.
数组
赋值
Array[1]=value
Array[2]=value
也可以用列来赋值
Array[$1]=$1
取值
For(a in array) print a,array[a]
可用来判断array中的唯一值
或
For(i=1;i<=len;i++) print array[i] len为数组长度
*******************************************************************************
7.
条件语句
前面已经使用到的if语句
格式:
if(表达式)
语句1
else
语句2
嵌套的if语句
if(表达式1)
{if(表达式2)
语句1
else
语句2
}
语句3
else {if(表达式3)
语句4
else
语句5
}
语句6
while语句
格式为:
while(表达式)
语句
do-while语句
格式为:
do
{
语句
}while(条件判断语句)
for语句
格式为:
for(初始表达式;终止条件;步长表达式)
{语句}
在awk的 while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。continue从当前位置跳到循环开始处执行。