合并多行

Merge multiple lines

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

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

如果我手动执行此操作,我会突出显示“=”并按两次 "delete" 按钮以连接并获得所需的结果。 最后5个字符“,=0A=”也需要删除。

Awk、Sed、Bash、Perl 或 Python 脚本是首选。 感谢您的帮助。

谢谢!

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

这个用awk最简单1:

awk -v RS=',=0A=\n' -F '=\n' -v OFS= '{  =  } 1' filename

诀窍是

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

补遗:强制疯狂sed解决方案:

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 指出这一点。

通过 Perl。

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

这是一个 Perl 解决方案:

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

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

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