此篇介绍一下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也可以使用默认,循环执行部分,是按行对文件进行处理的。