合并多行

时间:2015-04-02 11:57:27

标签: python bash perl awk sed

我有一个包含多个这样的文件:

s10123-yyy.bkp.abc01.zone,Windows File =
System,N/A,defaultBackupSet,default,272188(* )(S =
),Completed,INCR,Mixed,02/28/2015 19:00:27,02/28/2015 =
19:03:06,02/28/2015 20:32:11,02/28/2015 =
20:32:09,12.08,53.93%,0.18,98.52%,0%,0.12,1:28:23,N/A,8.203,N/A,67303,0,8=
3,"Disk_Library2, Disk_Library6,",N/A,N/A,=0A=

我需要像这样在一行中创建它:

s10123-yyy.bkp.abc01.zone,Windows File System,N/A,defaultBackupSet,default,272188(* )(S ),Completed,INCR,Mixed,02/28/2015 19:00:27,02/28/2015 19:03:06,02/28/2015 20:32:11,02/28/2015 20:32:09,12.08,53.93%,0.18,98.52%,0%,0.12,1:28:23,N/A,8.203,N/A,67303,0,83,"Disk_Library2, Disk_Library6,",N/A,N/A

如果我手动完成,我会突出显示" ="并按"删除"按钮两次连接并获得所需的结果。 最后5个字符",= 0A ="也需要删除。

首选Awk,Sed,Bash,Perl或Python脚本。 感谢你的帮助。

谢谢!

5 个答案:

答案 0 :(得分:1)

对于awk 1

,这是最简单的
awk -v RS=',=0A=\n' -F '=\n' -v OFS= '{ $1 = $1 } 1' filename

诀窍是

  • 使用,=0A=\n作为记录分隔符RS
  • =\n作为字段分隔符
  • 有一个空的输出字段分隔符OFS,因此字段会一个接一个地直接打印,并且
  • 在打印之前强制使用$1 = $1重建输出记录。

附录:强制性疯狂的解决方案:

sed -n '/,=0A=$/ { s///; H; s/.*//; x; s/\n//g; p; d; }; /=$/ { s///; H; }' filename

我不建议您使用它;我只是喜欢在sed中编写不应该用sed编写的东西。很有趣!

1 使用GNU awk和mawk测试,这是最常见的。但是POSIX并不严格要求多字符RS,因此更多深奥的awk可能会拒绝这一点。感谢@TomFenech指出这一点。

答案 1 :(得分:0)

在Python中,创建一个列表,然后使用extend方法将行添加到列表中,而不是append

答案 2 :(得分:0)

通过Perl。

perl -0777pe 's/=\n|,=[^,]*$//sg' file

答案 3 :(得分:0)

这是一个Perl解决方案:

perl -l -0777 -pwe"s/,?=(?:0A=)?\n//g" file
  • -0777禁用输入记录分隔符,将文件合并为一行。
  • -p从文件读取输入并将其打印回标准输出。
  • -l(在-0之前)为您的打印报表添加换行符。
  • 正则表达式s/,?=(?:0A=)?\n//g找到一个可选的逗号,后跟=,后跟可选的0A=字符串,以换行符结尾。

我不知道你的所有文件是否只是其中一条长行。如果它是多个这样的行,您应该将输入记录分隔符设置为=0A=\n,最有可能是chomp行并删除=\n

答案 4 :(得分:0)

SED

sed '
    :a
    /,=0A=$/ {s///; s/\n//g} # "end of line", remove the chars and newlines
    / \?=$/ {s///; N; ba}    # line continuation: remove the chars, append
                             # the next line, goto a
' file