Linux 命令之awk
学习了将近半年的linux,一直觉得awk命令是最难的,所以我是是能避免就避免用。
曾经看过各种网页,包括菜鸟教程,也是只会一些基本的。
我比较喜欢在实践中学习知识,在这里给大家实操介绍一下awk。
awk命令形式
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
- [-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量
- ’ ’ 引用代码块
- BEGIN 初始化代码块,在文件处理之前,初始化代码
- // 匹配代码块,可以是字符串或正则表达式
- {} 命令代码块,包含一条或多条命令
- ; 多条命令使用分号分隔
- END 结尾代码块,对文件处理完后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
我们来依次介绍一下含义
练习
我们以一个很小的文件为例:
cat test.txt
name chinese math english
parry 78 90 88
alice 80 93 79
mike 89 87 87
1、如果我们想要提取chinese分数大于85的行,并且打印出该行的行号。
awk -F"\t" '$2>85{print NR "\t" $0}' OFS="\t" test.txt
1 name chinese math english
4 mike 89 87 87
- F:指定test.txt的分割符号是Tab键
- $2:指第2列;以此类推,例如:$3指第3列;$0指打印所有列
- NR:awk有很多内置函数,比如NR输出行号,NF输出列数
- OFS:定义输出分隔符
2、如果想要统计一下chinese大于80的个数,小于80的个数,并且分别print为large和 small
awk -F"\t" 'BEGIN{A=0;B=0}{if ($2>80){A++;print "large"}else{B++;print "small"}} END{print A "\t" B}' OFS="\t" test.txt
large
small
small
large
2 2
BEGIN 设置A和B变量,如果chinese大于80,A就加1;反之,B加1
3、文件行列倒置
awk -F "\t" '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] "\t";print ""}}' test.txt
name parry alice mike
chinese 78 80 89
math 90 93 87
english 88 79 87