我有一个包含多个这样的文件:
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脚本。 感谢你的帮助。
谢谢!
答案 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