1.实验的文本 awk_test.txt
开头为1,2,3,各有五行。其中有些行的$6$7$8字段为空
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5
2 2 3 4 5 6 7 8
2 2 3 4 5
2 2 3 4 5 6 7 8
2 2 3 4 5
2 2 3 4 5
3 2 3 4 5 6 7 8
3 2 3 4 5 6 7 8
3 2 3 4 5
3 2 3 4 5 6 7 8
3 2 3 4 5
2. awk 统计列数
cat awk_test.txt | awk '{print NF}'
3.awk统计行数 & awk 引用shell里的变量
lines=`cat awk_test.txt| wc -l`
echo ${lines}
export lines
awk '{printf("%d",ENVIRON["lines"])}' awk_test.txt
4.awk 内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数 (列数)
NR 已读的记录数 (从1到最后一行行号)
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
5. 筛选空字段
例如,找出$8字段为空的行
cat awk_test.txt | awk '$8 ~/^$/{print NR}'
6.演示
现在awk_test.txt变为
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5
问题:求非空$6的平均值
cat awk_test.txt | awk 'BEGIN{b=0;} $8 !~/^$/{a+=$8;b++;} END{printf("%d\t%d\n",a/b)}'
7.awk 中的正则表达、通配符
- ~,匹配操作符, 用来在记录或者域内匹配正则表达式 (针对某列)
- !~表示不匹配
- *****可以和零个或多个任意字符匹配
- ?与任何单个字符匹配
- ** .** 匹配任何单个字符,每行的换行符也算
- $匹配行结束符
- ^匹配一行的开始
- *****匹配0或多个正好在它之前的那个字符
- **用来屏蔽特殊字符的含义
-
+匹配前面的正则表达式的一次或多次出现。
一些连用的正则表达符号: - ^$ 表示空行
- ^.$* 表示整行
8. awk 中的BEGIN和END
BEGIN: awk开始扫描输入之前执行,可以在里面进行变量赋值。
比如演示6中的BEGIN{b=0;} 。 BEGIN 初始化结束以后,后面的{}才正式开始扫描输入文件,默认以换行符为分隔。也可以更改,比如以:为分隔
awk -F ':' 'BEGIN {a=12;} {a+=$1;} END {print("%d\n",a)}' xxfile.txt
END:END之后列出的操作将在扫描完全部的输入之后执行,通常用于输出最终结果。
9. awk 和shell 之间传参
- shell 向 awk传参
# 1. “‘ $var ’”
var=”test”
awk ‘BEGIN{print “‘$var'”}’
# 2. awk -v 用于参数较少的情况下
var=”this is a test”
awk -v awk_var=”$var” ‘BEGIN {print awk_var}’
- awk 向 shell 传参