- 一、分隔符
- 1、输入分隔符
- 1.1 -F
- 1.2、内部变量 -v
- 2、输出分隔符
- 二、awk内部变量
- 2.1NR 行号 NF列数
- 2.2、FNR
- 2.3 、RS
- 2.4、ORS
- 2.5、FILENAME
- 2.6、ARGC
- 2.7、自定义变量
我们略微提到过"分隔符",但是并没有细说,那么我们今天就聊聊什么是分隔符,awk有哪些分隔符,awk的默认分割符是空格,但是,这样描述并不精确,因为,awk的分隔符还分为两种,“输入分隔符” 和 “输出分隔符” 。
输入分隔符,英文原文为field separator,此处简称为FS
输入分割符,默认是空白字符(即空格),awk默认以空白字符为分隔符对每一行进行分割。
输出分割符,英文原文为output field separator,此处简称为OFS
awk将每行分割后,输出在屏幕上的时候,以什么字符作为分隔符,awk默认的输出分割符也是空格。
一、分隔符
1、输入分隔符
1.1 -F
如下文本
默认输入分隔符是空格,我们还可以指定其他字符作为分隔符。
awk -F@ '{print $1,$2 }' fs.txt # 这里就是awk 语法加上[options]
可以看到,通过-F 选项,指定了使用@号作为输入分隔符,awk 将文本中的每一行都按照@分隔。
1.2、内部变量 -v
除了使用 -F 选项指定输入分隔符,还能够通过设置内部变量的方式,指定awk的输入分隔符,awk内置变量FS可以用于指定输入分隔符,但是在使用变量时,需要使用-v选项,用于指定对应的变量,比如 -v FS=’@’,如下图。
awk -v FS='@' '{ print $1 $2 }' fs.txt
2、输出分隔符
当awk为我们输出每一列的时候,会使用空格隔开每一列,其实,这个空格,就是awk的默认的输出分隔符,下图中红框标注的空格部分,就是awk的默认的输出分隔符。
指定输入和输出分隔符
awk -v FS='@' -v OFS='#' '{print $1,$2 }' fs.txt
#指定输出分隔符为#
注意如果print 中多个参数不使用逗号的话,输出结果回直接拼接在一起。
二、awk内部变量
在上面输入分隔符的第二个实例中就是用awk内部变量实现的。那什么是awk内部变量呢?
对于awk来说"变量"又分为"内置变量" 和 “自定义变量” , "输入分隔符FS"和"输出分隔符OFS"都属于内置变量。内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量.
awk常用内置变量:
FS:输入字段分隔符, 默认为空白字符
OFS:输出字段分隔符, 默认为空白字符
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
2.1NR 行号 NF列数
第二个字段NF 表示每一行都有5列.
注意这里同样$0 ,’符号,而NR,NF则不需要。在awk中只有引用像$0 ,
引用其他变量时,不管是内置还是自定义变量,都不使用
2.2、FNR
当使用 NR显示多个文件时,看到 多个文件的所有行会按照顺序进行排序。
awk '{ print NR,$0}' col_print.txt file2.txt
看到结果中,FNR 则会分别显示各个文件的行号
2.3 、RS
RS是输入行分隔符,如果不指定,默认的"行分隔符"就是我们所理解的"回车换行"。假设,我们不想以默认的"回车换行"作为"行分隔符",而是想使用空格作为所谓的行分隔符,也就是说,我们想让awk认为,每遇到一个空格,就换行,换句话说,我们想让awk以为每次遇到一个空格就是新的一行。
示例如下
awk -v RS=' ' '{ print NR,$0 }' RS.test
从上图可以看到,在awk解析文本时,每当遇到空格,awk就认为遇到的空格是换行符,于是awk就将文本换行了,而此时人类理解的"回车换行",对于awk来说并不是所谓的换行符,所以才会出现上图中第2行和第3行的现象,即使从人类的角度去看是两行文本,但是在awk的世界观里,它就是一行。
理解了输入行分隔符后,同理再来看输出行分隔符。
2.4、ORS
默认情况下,awk将人类眼中的"回车换行",当做"输出行分隔符",此时,awk的"世界观"与人类的"世界观"是相同的。
awk -v ORS=’#’ ‘{ print NR,$0 }’ RS.test
看到awk 在处理文本后输出换行符已不在时默认的回车符了,而是#,尽管直观上我们看到这明明是一行数据,而而awk认为它是三行数据。
2.5、FILENAME
这个内置变量,从字面上,就能看出是什么意思,没错,就是显示文件名,演示效果如下
awk '{print FILENAME ,$0}' col_print.txt file2.txt
2.6、ARGC
ARGV 内置变量表示命令行参数的个数, ARGV内置变量表示的是一个数组,这个数组中保存的是命令行所给定的参数。这样解释还是很模糊,不容易理解,我们来看看示例。
awk 'BEGIN {print "BEING"}' col_print.txt file2.txt
awk 'BEGIN {print "BEING" ,ARGV[1],ARGV[2]}' col_print.txt file2.txt
ARGV内置变量表示的是一个数组,既然是数组,就需要用上图中的下标的方式,引用对应元素的值,因为数组的索引都是从0开始的,所以,ARGV[1]表示引用ARGV数组中的第二个元素的值,从返回结果可以看出,ARGV[1]对应的值为col_print.txt,同理,ARGV[2]的值,发现ARGV[2]对应的值为file2.txt,这个时候,你明白ARGV内置变量的含义了吗,说白了,ARGV内置变量表示的是:所有参数组成的数组。 ARGV[0]对应的是哪个参数呢?如下
awk就是这么规定的,'pattern{ action }'并不被看做是参数,awk被看做为参数。那对于ARGC则表示参数的数量,也可以理解为ARGV数组的长度。示例如下
awk 'BEGIN {print ARGV[0],ARGV[1],ARGV[2],ARGC}' col_print.txt file2.txt
2.7、自定义变量
1、 -v varname=value 变量名区分字符大小写。
2、在program中直接定义。
示例演示1、
awk -v var1=v1 'BEGIN {print var1}'
awk 'BEGIN {var1="v1";print var1}'
#注意,变量定义与动作之间需要用分号";"隔开。