最近学习了AWK的基本操作。以下是我整理的学习笔记。
基本的命令行:awk -(选项) ‘{操作动作}’ 文件名
*************************************************************
以 $n显示列,$1表示第一列,$2表示第二列,$0表示所有的列,
print 表示打印:awk ‘{print $0}’ grade.txt 打印grade文件的所有列
以下是awk中的一些内置变量和内置函数
-V 赋值作用,写在引号前
awk -v rest=100 '{ print $1,$7*rest}' grade.txt
-F表示FS 字段的分隔符,默认为空格
use-f.txt 以#为分隔符
awk -F "#" '{ print $1, $2,$3}' use-f.txt
如果数据中的各列用2个以上的分隔符。
awk -F "##|*%|sq" '{ print $1,$2,$3,$4}' use-f.txt
FIELDWIDTHS 以空格分隔的字段宽度
awk 'BEGIN{FIELDWIDTHS="3 6 9 12"}{ print $1,$2,$3,$4}' use-f.txt
FILENAME 当前正在处理的文件名,该变量不能在BEGIN块中使用
FNR 当前处理的记录号
IGNORECASE 如果该变量设置为非0值,在进行字符串匹配时忽略大小写
NF 当前记录中的字段个数
NR 已经读出的记录数
OFS 输出的字段分隔符,默认为空格
awk 'BEGIN{OFS="*"} {print $1,$2,$3,$4,$5,$6,$7}' grade.txt
ORS
输出的行分隔符
awk 'BEGIN{ORS="*"} {print $1}' grade.txt
RS
输入的行分隔符
index(s,t)函数返回目标字符串s中查询字符串t的首位置
awk '{print $1,index($1,”abc”)}' grade.txt 返回abc出现的位置
length函数返回字符串s字符长度
awk '{print $1,length($1)}' grade.txt
substr(3个参数) 截取字符串
awk '{print $1,substr($1,2,5)}' grade.txt 从第一列的第二个字符开始截取5个字符
substr(p,n) 截取字符串这种种形势是2个参数的,返回字段P的第n个字符开始到字符结尾的所有字符串
*******************************************************************************
比较操作符
<小于 >大于 ==等于!= 不等于 ~匹配正则表达式!~不匹配正则表达式
= += *= /= %= 为赋值操作
|| && 等同于 and 和 or
几个实例
awk ‘{if (FNR>=2 && FNR<=4){print $0}}’ 打印出第2到4行
awk '{if ($4=="yellow") || $4~/brown/} {print $0}}' grade.txt
打印出第一列为yellow 或者第四列为brown的记录
awk ‘{if (FNR %2 != 0) {print $0}}’ grade.txt
隔行打印
******************************************************************************
模式
包括BEGIN 和 END
BEGIN发生在浏览记录之前。可以处理初始化的代码,用于赋值或者打印头部
awk 'BEGIN{print "Name Belt\n----------------------------"}{print $1\”t”,$2}' grade.txt
ENDawk还提供了另一个特殊块,叫作END块。awk在处理了输入文件中的所有行之后执行这个块
END计算最终总和。
awk '{sumof7=sumof7+$7}END {print sumof7}' grade.txt
关于数组的一个使用
如果第一列的NAME中有重复的值,现在要统计每个唯一NAME的第七列的总和,使用数组和END来操作
awk ‘{aa[$1]=a[$1]+$7}END{for(k in aa) print k,aa[k]}’ grade.txt
数组
赋值
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为数组长度
*******************************************************************************
条件语句
前面已经使用到的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从当前位置跳到循环开始处执行。