awk空行合并

  

 1 [root@localhost ~]#cat urfile
 2 [DEFAULT]
 3 key1=value1
 4 key2=value2
 5 key3=value3
 6 
 7 
 8 [agent]
 9 key1=value1
10 key2=value2
11 key3=value3
12 
13  
14 
15 
16 [database]
17 key1=value1
18 key2=value2
19 key3=value3
20 
21 
22 [redis]
23 key1=value1
24 key2=value2
25 key3=value3

 

需求:
文本开头没有空行,section之间的空行行数不定,最后一个section之后也有n行空行,想将section之间的空行压缩成一行

解法一:
PF大神太绝了,直接一个cat -s urfile就搞定了;将多行空行合并成一行

解法二:
awk除去空行awk NF urfile
但没有做过将多行合并成一行,第一反应是用脚本
不过更喜欢awk一行流

[root@localhost ~]#awk -vRS="" '{print $0"\n"}' urfile

  

开始对这个不是很理解,只是懂将行分隔符替换成空了

[root@localhost ~]#awk -vRS="" '{print NR $0"\n"}' urfile
1[DEFAULT]
key1=value1
key2=value2
key3=value3

2[section1]
key1=value1
key2=value2
key3=value3

3[section2]
key1=value1
key2=value2
key3=value3

4[section3]
key1=value1
key2=value2
key3=value3

[root@localhost ~]#awk -vRS="" '{print $0"END"}' urfile
[DEFAULT]
key1=value1
key2=value2
key3=value3END
[section1]
key1=value1
key2=value2
key3=value3END
[section2]
key1=value1
key2=value2
key3=value3END
[section3]
key1=value1
key2=value2
key3=value3END

 

  


如果RS被设置为空,那么awk会将连续的空行作为行分隔符,与RS设置成"\n\n+"有什么区别???
1、忽略文件开头和结尾的空行。且文件不以记录分隔符结束,即最后不是空行,会将最后一个记录的尾\n去掉
2、设置RT变量未空
3、影响FS变量
这个怎么理解?对于1、2两点,当作习题留给大家自己测试,3我们下节来讲。

总结下RS的3种情况:
1) 非空字符串
以固定字符串作为行分隔符,同时设置变量RT为固定字符串
2) 正则表达式
以正则表达式作为行分隔符,同时设置变量RT为正则表达式实际匹配到的字符串
3) 空字符
以连续的空行作为行分隔符,如果FS为单个字符,会将\n强制加入到FS变量中

理解了RS,再来理解ORS就简单了。RS是awk读取文件时的行分隔符,ORS则是awk输出时的行结束符。
更简单的讲,就是awk在输出时,会在每行记录后面增加一个ORS变量所设定的值。
ORS的值只能设定为字符串,默认情况下,ORS的值是\n


TIM的awk十三问
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1790335&page=1&authorid=666268

posted @ 2017-07-14 10:40  陈浩然201  阅读(986)  评论(0编辑  收藏  举报