合并多行
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
我有一个包含多个这样的文件:
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