我们经常会说,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差别在哪?