AWK神器,继续案例

例子一:打印文件N到N+M行

-F :允许awk更改其字段分隔符
-v :var=val把val值赋值给var如果有多个变量要赋值,那么就写多个-v,每个变量赋值对应一个-v

cat txt
1.021 33
A 44
2.53 6
b 7
49 1
C 9
5.0 8
#打印文件N到N+M行
awk -v N=2 -v M=3 'NR==N,NR==N+M{print}' txt

例子二:内置变量

ARGC:命令行参数的个数
ARGV:命令行参数数组
ARGIND: 当前被处理文件的ARGV标志符

cat a
I am file A
cat b
I am file B
 awk '{if(ARGIND==1){print} if(ARGIND==2){print}}' a b

NR:已经读出的记录数
FNR当前文件的记录数

#输入文件a和b,由于先扫描a,所以扫描a的时候必然有NR==FNR,然后扫描b的时候,FNR从1开始计数,而NR则接着a的行数继续计数,所以NR > FNR
awk 'NR==FNR{print} NR>FNR{print}' a b

FS:输入字段分隔符(缺省为:space:),相当于-F选项
awk -F ':' '{print}'a 和 awk 'BEGIN{FS=":"}{print}' a是一样的

OFS:输出字段分隔符(缺省为:space:)

cat b
1:2:3
4:5:6
awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' b
#那么把OFS设置成";"后就会输出
1;2;3
4;5;6

(小注释:awk把分割后的第1、2、3个字段用$1,$2,$3...表示,$0表示整个记录(一般就是一整行))

NF:当前记录中的字段个数

cat c
1:2:3
1:2
awk -F ':' '{print NF}' c
3
2
#可用于字段数过滤
awk -F ':' '{if(NF==3)print}' c
1:2:3

RS:输入记录分隔符,缺省为"\n"
缺省情况下,awk把一行看作一个记录;如果设置了RS,那么awk按照RS来分割记录

cat d
hello world;I am a boy;happy
awk 'BEGIN{RS=";"}{print}' d
hello world
I am a boy
happy

ORS:输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号

catc
1:2:3
1:2
awk 'BEGIN{ORS=";"}{print NF}' c
1;1;

你可能感兴趣的:(awk,内置变量)