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