awk的工作模式: 将文本数据先进行一行一行做分割,再以某种定义将行数据分割为字段数据,形成基本的数据单位, 然后执行awk中的代码;
字段: 从awk的角度看, 本文的基本组成单位为字段, 所以awk处理的数据对象就是字段;
注: 默认以空白为分割, 将一行文本分割成若干字段, 其中 $number 就表示某个字段
猜测: $0 代表的是当前所在行的行内容;
awk -F'正则表达式' '{print $number}' 按照某种规则分割字段
awk中内置的变量:
NF number final 每一行的字段总数,也就是最后一列所在的列数;
NR number row 保存的值是文件数据的行数,是总行数
FNR 保存的值是单个文本数据的行数值
自定义变量语法: -v 变量名=xxx; 简化写法: 变量名=xxx
猜测: awk中数组的声明语法: 数组名[下标名称]="存储数据"
BEGIN 用于给变量赋初始值; END 用于输出结果
awk中 '' 单引号引起来的部分就是awk的代码:其组成由 判断+{代码块} 为单位组成;
基本单位形式: 判断+{代码块}
判断 : 就是用于判断此行有没有资格执行判断后面的 {代码块} 代码块,用作判断依据的可以是NR和正则表达式,或者&&两者共同用作判断条件;
注: /正则表达式/ 书写正则表达式的语法;
{代码块} : 本身就相当于java中某个方法体内的代码块;当然,其内部可以写if,for等等代码;
print 方法自带换行符; printf 方法不带换行符;
awk可以重定向,将内容输出到某个文件下, 记得给文件名加 "" 双引号;
练习题:
统计一个文件有多少个单词?
统计一个文件中某个单词出现的次数?
awk '{for(i=1;i<=NF;i++){if("word"==$i)num++}} END{print num}' filepath
分组求解和:
awk -F "\t" '
BEGIN{
print "分段 \t 天数"
g13 = 0
g34 = 0
g45 = 0
g56 = 0
g67 = 0
g78 = 0
g8up = 0
}
{
if(($5+$6+$7) < 30000){
g13 ++
} else if(($5+$6+$7) >= 30000 && ($5+$6+$7) < 40000){
g34 ++
} else if(($5+$6+$7) >= 40000 && ($5+$6+$7) < 50000){
g45 ++
} else if(($5+$6+$7) >= 50000 && ($5+$6+$7) < 60000){
g56 ++
} else if(($5+$6+$7) >= 60000 && ($5+$6+$7) < 70000){
g67 ++
} else if(($5+$6+$7) >= 70000 && ($5+$6+$7) < 80000){
g78 ++
} else{
g8up ++
}
}
END{
print "1-3",g13
print "3-4",g34
print "4-5",g45
print "5-6",g56
print "6-7",g67
print "7-8",g78
print "8up",g8up
}
filepath