awk总结

2017-03-17  本文已影响0人  荷包蛋酱

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 中的正则表达、通配符

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 之间传参

# 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}’

上一篇 下一篇

猜你喜欢

热点阅读