此篇介绍一下awk命令的一些常见用法。
awk命令的使用模式
awk 'BEGIN{}pattern{commands}END{}' file_name
取出第2列的内容
awk -F',' '{print $2}' data.txt
输出每一行有多少列
awk '{print NF}' data.txt
输出每一行最后一列的值
awk '{print $NF}' data.txt
如果第一列小于第二列则打印此行
awk '{if ($1 < $2) print $0}' data.txt
如果第一列大于100则打印第一列,否则打印ok
awk '{if ($1 > 100) print $1; else print "ok"}' data.txt
打印除最后列之外的所有列
awk -F':' {'$NF="";print $0'} data.txt
打印s在每一行第一个域中的位置,若为0表示没有这个字符
awk -F '#' '{print (index($1, "s"))}' data.txt
对某列的数字求和
awk '{sum += $1}END{print sum}' data.txt
在保持文件原有内容顺序的基础上删除重复的行
awk '!visited[$0]++' data.txt > result.txt
1. visited[]相当于维护了一个关联数据,键为一行的内容,值为该行出现的次数
2. 省略的默认动作是打印该行
3. 如用sort会改变文件内容顺序,uniq仅能去重排序连续的行
NR,FNR,NF
1. NR表示从awk开始执行后,按照记录分隔符读取的数据次数。默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。
2. 在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。
3. NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。
4. NF表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。
处理多个文件
awk处理多个文件的基本语法是:
awk -F分隔符 'BEGIN { 初始化 } { 循环执行部分 } END { 结束处理 }' file_list1 file_list2
其中BEGIN和END可以省略,-F也可以使用默认,循环执行部分,是按行对文件进行处理的。