如何合并包含某些内容的文本并留下空白行

时间:2015-02-05 09:17:16

标签: bash awk

我在Ubuntu上有一个地址txt文件。像下面的东西 -

Name
Address1
Address2
Address3

Name2
Address12
Address22
Address32

如何将内容合并为 -

Name Address1 Address2 Address3
Name2 Address12 Address22 Address32

实际上地址是一个接一个地写入文件 - 如上所述。新地址由新行或空行分隔。现在我想将每个地址行合并为一行 - 所以重复所有地址

3 个答案:

答案 0 :(得分:5)

这是awk

awk -v RS= '{$1=$1}1' file
Name Address1 Address2 Address3
Name2 Address12 Address22 Address32
Name3 Address13 Address23 Address33

设置RS使awk使用数据块作为记录 {$1=$1}1重建了这条线。

如果字段以0开头(不那么健壮),则会失败:

awk -v RS= '$1=$1' file

答案 1 :(得分:4)

RS设置为空字符串将使用一个或多个空行作为记录分隔符。

$ cat addr.txt
Name
Address1
Address2
Address3

Name2
Address12
Address22
Address32




Name3
Address13
Address23
Address33

$ awk 'BEGIN { RS="" } { gsub("\n"," ") }1' addr.txt
Name Address1 Address2 Address3
Name2 Address12 Address22 Address32
Name3 Address13 Address23 Address33

来自awk用户指南:

  

RS ==“”

     

记录由空白行分隔。当FS是单身时   字符,然后换行符始终作为字段   除了FS可能具有的任何值之外,还有分隔符。领导和   将忽略文件中的尾随换行符。

答案 2 :(得分:1)

awk -v ORS=" " '{print}/^$/{printf("\n")}END{printf("\n")}' File

将输出记录分隔符(ORS)设置为space,打印每一行。每当遇到空行时,请打印newline ("\n")。在"\n"块中打印END以获得所需的输出。希望这是你想要的。

<强>示例:

sdlcb@Goofy-Gen:~/AMD$ cat File
Name
Address1
Address2
Address3

Name2
Address12
Address22
Address32

Name2
Address12
Address22
Address32
sdlcb@Goofy-Gen:~/AMD$ awk -v ORS=" " '{print}/^$/{printf("\n")}END{printf("\n")}' File
Name Address1 Address2 Address3
Name2 Address12 Address22 Address32
Name2 Address12 Address22 Address32
相关问题