awk常用用法

1. 提取某一列的字段

为了便于举例子说明,准备了一个小的数据文件(ip_cluster.txt),如下

ip               core_num     model_name
11.20.51.204     16           example_gbdt
11.20.51.205     16           example_gbdt
11.20.51.203     16           example_gbdt
11.20.246.134    16           example_gbdt
11.20.246.133    16           example_gbdt
11.20.246.131    8            example_dnn
11.20.246.130    8            example_dnn
11.20.246.129    8            example_dnn
11.20.246.128    8            example_dnn
11.20.244.121    8            example_dnn
  • 提取example_gbdt模型对应的机器
awk '{if ($3=="example_gbdt") {print $1}}' ip_cluster.txt

# 如果模型名字放到了 model_name 变量里,注意引号的区别
model_name=example_gbdt
awk '{if ($3=="'$model_name'") {print $1}}' ip_cluster.txt

上面的命令也可以省略 if(),而直接写判断条件。但我个人觉得,从程序更容易被人理解的角度,应该加上 if 字样。

2. 交互式输入

如果不加后面的文件(ip_cluster.txt),awk会停在那里,等待用户交互式输入,没输入一行(在awk里叫一条record),进行一次处理。

也可以通过管道进行输入,如

cat ip_cluster.txt | awk ...

3. 定义变量

# 定义内建变量
awk
'BEGIN{OFS=","}{print $1,$2,$3}' ip_cluster.txt

# 定义普通变量
awk 'BEGIN{a=1;b=2} {print a+b}'

4. 内建变量

常用的变量有

  • NR:Number of Record,可以理解为行数
  • NF:Number of Field,可以理解为列数
  • FS:Field Separator,输入分隔符
  • OFS:Out Field Separator,输出分隔符

5. 输入多个文件

awk后面可以直接追加多个文件,处理时的效果仿佛将多个文件拼接到一起一样。

6. 列赋值,人工打码

awk '{$3="xxxx";print $0}' ip_cluster.txt

# 输出效果
ip core_num xxxx
11.20.51.204 16 xxxx
11.20.51.205 16 xxxx
11.20.51.203 16 xxxx
11.20.246.134 16 xxxx
11.20.246.133 16 xxxx
11.20.246.131 8 xxxx
11.20.246.130 8 xxxx
11.20.246.129 8 xxxx
11.20.246.128 8 xxxx
11.20.244.121 8 xxxx

7. 与正则表达式的配合

# 正则表达式写在两个斜杠之间
awk '/example_.*/{print $0}' ip_cluster.txt

简要回顾下基础的正则表达式

  • ^开始,$结尾
  • [] 一个字符,取或的关系,如 [xyz], [a-zA-Z], [^a-z]  说明:中括号里的 “^” 表示取反
  • * 出现零次或多次
  • + 出现一次或多次
  • ?可以有也可以没有
  • {} ab{3}c,可以匹配 abbbc;{}里还可以是范围,如{3,4},{3,}
  • ()一段东西看成一个整体,如(ab)+c,可以匹配 ababc

8. 总结

awk非常的强大,尤其是在行列式的数据集合上面,展现出了很强的表达能力。配合一个数据文件,堪比小型数据库。

posted @ 2020-04-18 14:35  不写诗的诗人小安  阅读(141)  评论(0编辑  收藏  举报