我们经常会说,awk是基于行列操作文本的,但如何定义“行”呢?这就是RS的作用。

默认情况下,RS的值是\n。下面通过实例来理解下RS。

kris@letuknowit:~$ echo '1a2a3a4' | awk '{print $1}'
1a2a3a4
kris@letuknowit:~$ echo '1a2a3a4' | awk 'BEGIN{RS="a"}{print $1}'
1
2
3
4

我们可以看到,在更改了RS的值后,awk定义的行已经不是我们实际意义中的行了。

上面例子中RS为固定的字符串,RS也可以定义为正则表达式。

kris@letuknowit:~$ echo '1ab2bc3cd4de5' | awk 'BEGIN{RS="[a-z]+"}{print $1,RS}'
1 [a-z]+
2 [a-z]+
3 [a-z]+
4 [a-z]+
5 [a-z]+

下面我们看看将RS设置为空会是什么情况

kris@letuknowit:~$ cat > urfile
1

2

3

4
^C
kris@letuknowit:~$ awk 'BEGIN{RS=""}{print $0}' urfile 
1
2
3
4

与将RS设置成\n\n+有什么区别呢?

kris@letuknowit:~$ awk 'BEGIN{RS="\n\n+"}{print NR,$0}' urfile 
1 1
2 2
3 3
4 4

kris@letuknowit:~$ awk 'BEGIN{RS=""}{print NR,$0}' urfile 
1 1
2 2
3 3
4 4

区别主要是对吼一条记录,记录分隔符为\n\n+的时候,最后会有一个换行。

当记录分隔符指定为空的时候,awk会将多个连续的空白行看做一个单一的记录分隔符,而且会忽略文件开头和结尾的空行。如果文件不以记录分隔符结束,即最后不是空行,awk会将最后一个记录的尾\n去掉。

理解了RS,再来理解ORS就简单了。RS是awk读取文件时的行分隔符,ORS则是awk输出时的行结束符。

更简单的讲,就是awk在输出时,会在每行记录后面增加一个ORS变量所设定的值。

ORS的值只能设定为字符串,默认情况下,ORS的值是\n

kris@letuknowit:~$ seq 5 | awk '1'
1
2
3
4
5
kris@letuknowit:~$ seq 5 | awk 'BEGIN{ORS="a"}1'
1a2a3a4a5a

上面的那个awk指令和下面的等效,但是要更加简洁。

kris@letuknowit:~$ seq 5 | awk '{print $0}'
1
2
3
4
5

转载请注明:知识蚂蚁 » awk基础知识:RS与ORS差别在哪?

我来说说

(便于我们更好的交流)

有不明白的地方欢迎留言哦~
取消