awk是功能最强大的文本工具。awk也是按行操作,对行操作完之后可以根据指定命令来对行取列。
awk分隔符:默认空格或者tab,多个空格会自动压缩成一个。Awk还支持编程语言。
awk操作流程:
1,按照命令找到指定行
2,找到后,执行操作,默认为打印。
用法:
Awk 选项 ‘模式或条件{操作}’ 文件
-F 指定分隔符
-v 变量赋值
操作:默认打印
Awk常用内置变量:内置变量$n前面加$,其他的不加,更不能用引号,也不能用括号,否则会被当作字符串处理
$0为全部
$n 表示处理行的第几列
NR:处理行的行号
NF:处理当前行的字段个数,$NF表示最后一个字段
FS:列分隔符,指定文本的分隔符,和F作用相同
OFS:输出文本的分隔符
RS:指定分隔符为回车。
打印多列:awk ‘{print $1,$2,$3}’ test.txt8
打印指定行号:awk 'NR==2,NR==4{print}' test.sh
打印范围行号:awk 'NR==2;NR==4{print}' test.sh
打印偶数行: awk 'NR%2==0{print}' test.txt
打印奇数行: awk 'NR%2==1{print}' test.txt
**与^ 求幂
内置函数getline:
1,,如果getline左右两侧没有重定向符(<>)或者没有管道符(|)时,awk会先读第一行,但是如果加了getline,会跳过第一行读取第二行
2,如果两边给有重定向符(<>)或者有管道符(|)时,getline作用于定向输入文件:
awk '{getline < "test1.txt"; print > "test2.txt"}' test1.txt
Begin模式
Awk ‘BEGIN{...}; {...}; END{...}’ 文件
赋值条件 处理文件命令 结束语句
判断文件有多少行:awk 'BEGIN{i=0};{i++};END{print i}' test.txt
条件判断:awk -F: '{if ($3>10) {print}}' test.txt
三元表达式:
Awk ‘(条件表达式)?(A表达式或者值):(B的表达式或者值)’ 文件
如果第三列大于第四列,打印第三列:awk -F '{i=($3>$4)?$3;$4{print i}}' test.txt
字符串比较:
$n~”字符串” 表示第n个字段包含某个字符
$n!~”字符串” 表示第n个字段不包含某个字符
$==”字符串” 表示第n个字段就是某个字符
$!=”字符串” 表示第n个字段不是某个字符
Awk结合数组:
定义数组:awk ‘BEGIN{a[0]=10;a[1]=20;a[2]=30; for(i in a)print i,a[i]}’
小实验:统计文件内字符段的个数:
awk '{a[$1]++};END{for (i in a) {print i,a[i]}}' test.txt