Unix脚本搜索模式并将下一行添加到适当的位置

时间:2014-11-16 07:40:42

标签: shell unix

源文件

:20:abcd  
:28D:a   
:50H:/1  
2  
3  
4  
5  
:30:020108  

输出应为

:20:abcd  
:28D:a  
:50H:/1 2 3 4 5   
:30:020108  

1 个答案:

答案 0 :(得分:1)

这是一个解决方案:

$ awk 'NR==1{printf "%s",$0;next;} /^:/{printf "\n%s",$0;next} {printf " %s",$0;} END{print""}' file
:20:abcd
:28D:a 
:50H:/1 2 3 4 5
:30:020108

这是另一个使用更少命令但稍微更精细的逻辑:

$ awk '{printf "%s%s",(/^:/ && NR>1)?"\n":sp,$0;sp=" "} END{print""}' file
:20:abcd
:28D:a 
:50H:/1 2 3 4 5
:30:020108

解释

两种解决方案的工作方式类似:每次遇到以冒号开头的行时,都会在新行上打印出来。没有的每一行都附加到上一行。

通常,当程序打印一行时,换行符会附加到该行的末尾。在这个程序中,在我们查看下一行之前,我们不知道当前行是否需要换行符。因此,每行都打印出没有尾随换行符。在下一行的开头,我们决定打印换行符(开始换行)或空格(以便将新行附加到最后一行)。

让我们更详细地看一下上面的第二个解决方案:

  • `printf“%s%s”,(/ ^:/&& NR> 1)?“\ n”:sp,$ 0

    打印出(a)换行符或变量sp,然后打印(b)当前行。打印换行符或sp的决定是由这个三元声明做出的:

    (/^:/ && NR>1)?"\n":sp
    

    如果该行以冒号/^:/开头,这不是第一行NR>1,则括号中的数量计算结果为true,换行符,\n已被选中。否则,选择变量sp

    在程序开始时,sp的常用awk默认值为空字符串。

  • sp=" "

    打印第一行后,sp被分配给一个空格。它将为该程序的其余部分保留此值。

  • END{print""}

    在程序结束时,会打印另一个换行符以完成最后一行。