awk小计
##记录一下学习awk的东西
awk进行流处理,我们一般主要是对列对象进行一些操作。
awk命令格式:
awk ‘pattern’ ‘action’ filename;
其中pattern 代表匹配模式,如,我想匹配文件中的出现“test”的行,则可以写成,awk /test/ ‘{print $0}’ 1.txt;
所有要进行的操作即action,要写成形如‘{}’的格式,‘’所包含的内容可以有这种格式:‘BEGIN …{} END…’,其中begin和end是在处理文本之前和之后可进行的操作,如:
awk 'BEGIN {print “this text show how begin work”} {print $1} ',这意味着,再处理文本之前,首先会执行 begin 后面的第一个{}中的action,然后对每行执行第二个action.
相对的END, awk ‘{print $1} END {print “this text show how end word”}’,这表示对每行处理结束之后,将执行END后面的action,。
现在讨论一下awk中的行处理,如,现在想对莫一个文本中的偶数行,进行一种处理,则可以写:
awk ‘NR%2==0 {print $1}’ filename, 可见,NR代表当前处理行,每处理一行会递增NR++(ps: this is anoher FNR,we’ll talk is later),so,这也是一种命令形式,既在‘{}’中的花括号前,可以加一些逻辑判断,‘do_some_logical {}’,只有条件为真,才会去执行后面的action,如果我只想打印出偶数行,显然我可以写:
awk ‘NR%2==0 {print $0}’;此外还有一种有趣的写法:
awk ‘{getlilne; print $0}’;这里解释一下,awk 每次读取一行进行处理,getline是内置的一种命令,继续往下读取,同时会更新NR, $0 1 2…,所以这样做,awk运行时读取了第一行,然后getline,到了第二行,然后print,然后awk读取了第三行,然后getline到了第四行, 然后print。此外还可以看出{}中可以有多个命令,以;进行分割。
介绍下FNR,awk可同时处理多个文件,所以NR其实代表当前总行数,对于所有文件都会递增,然而FNR代表当前文件,当处理第二个文件时FNR会重新从0开始,NR则不会,只是一直递增。可以用ARGIND的值指代第几个文件,既 arg index。
awk是一种脚本语言,可写成脚本,开头写#!/bin/awkl即可 ./filename.awk,这样运行,如同shell。
(ps: awk很复杂,{}中可以有变量,做运算,加循环,之后再谈)