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
"世界上只有一种真正的英雄主义,就是认清了生活的真相后,还依然执着地热爱它。"
——罗曼·罗兰