引言
平常工作或学习中总是需要对一些数据进行处理(例如在工作中,需要对日志的一些数据进行统计)。而awk 这是好用的工具之一,倾向于一行当中分成数个字段进行处理。
基本概念
公式
awk '条件类型1{操作1} 条件类型2{操作2} ...' filename
操作说明
处理对象
两个单引号+大括号{} 设置想要对数据进行的处理操作, filename表示处理的数据文件。
1、可以对文件进行操作。 如:
awk '***' filename
2、 可以接前一段命令的输出。 如:grep *** filename | awk '***'
表示对查询结果的处理
处理流程
awk '条件类型1{操作1} 条件类型2{操作2} ...' filename
1、读入第1行,并将第1行的数据写入$0、$1、$2… 其中$0表示整行, $n表示分割之后第n列(这里会有个坑,后续会碰到)
2、根据『条件类型』的限制,判断是否需要进行后面的"操作"。
3、完成所有操作与条件类型、
4、若还有后续的【行】的数据,重复1~3。
分隔符
前面说到awk主要处理每行字段内的数据,这意味着要对每一行进行分段。默认分割字段为"空格键" 和 “[Table]键”。
如在文件中写入"123 234" echo "123 234" > 1.data
然后如果想分别打印出来则可以使用awk '{print "第一列:"$1"\t第二列:"$2}' 1.data
如果在文件中写入的是"123,234" echo "123,234" > 2.data
那在想要得到相同的效果, 则需要设置分隔符定义:
1、 可以使用 -F’,'的形式:
awk -F',' '{print "第一列:"$1"\t第二列:"$2}' 1.data
emmmm 貌似出了问题。。检查一下,发现是 1.data,中间为空格,因此以逗号(,) 分割的话,只会分割出一列来。第二列的值为空。
修改过来后,解决
2、可以采用awk的内置变量帮忙"FS"awk '{FS=","} {print "第一列:" $1 "\t第二列"$2}' 2.data
emmmm 貌似又粗了问题。。再检查一下,看似没问题。
这里就是上面说到的坑
对于第一行的处理,是先读入,再根据分隔符(此时没有用-F设置,因此还用的是默认分隔符【空格】or【TAB】 )填入$0 …
直到第二行再以FS=','
进行处理
因此解决办法就是采用流程控制关键词BEGIN
。
BEGIN后的操作块 表示在处理任何输入数据之前执行
,通常用来修改内置变量的值
,例如域分隔符FS,输出分隔符OFS,每行间的分隔符ORS等
其他的流程控制关键词后续会统一说明
内置变量
awk自带多种内置变量,熟练掌握可以再处理数据时更加得心应手
变量名称 | 代表意义 |
---|---|
NF | 每一行($0)拥有的字段总数 |
NR | 目前awk所处理的是第几行数据 |
FS | 目前的分隔字符 |