源文件
:20:abcd
:28D:a
:50H:/1
2
3
4
5
:30:020108
输出应为
:20:abcd
:28D:a
:50H:/1 2 3 4 5
:30:020108
答案 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""}
在程序结束时,会打印另一个换行符以完成最后一行。