是否可以将多个块/行合并为“单个”行?所以基本上如果下一行以相同的“#Msg”标签开头,则将其附加到上一行。 (很难解释,但我的例子说明了自己)(块由一个新的/空白行分隔)
我的输入文件如下所示:
#Msg,00000
#Msg,00001
#Msg,00002
#Msg,00003
#Msg,00004
#Msg,00005
#Msg,00006
#Msg,00007
#Msg,00008
#Msg,00009
#Msg,00010
#Msg,00011
输出应该是这样的:
#Msg,00000
#Msg,00001 #Msg,00002
#Msg,00003 #Msg,00004
#Msg,00005
#Msg,00006 #Msg,00007 #Msg,00008
#Msg,00009
#Msg,00010 #Msg,00011
任何建议都非常欢迎。
在Perl中这很容易做到:
perl -00 -ple 'tr/\n/ /'
-e CODE
指定了该计划。
-p
在它周围包装一个读/写行循环(默认情况下,它从STDIN读取,但您也可以在命令行上指定一个或多个文件名)。
-00
指定输入“行”实际上是段落。
-l
有两个效果:传入的行终止符会自动从行中删除,并且传出行会添加行终止符(因为我们使用了-00
(段落模式),我们的行终止符实际上是\n\n
)。
回顾一下:
我们一次阅读一段输入。对于每个段落,我们删除任何尾随换行符。然后我们将每个换行符翻译成一个空格。最后我们输出转换后的段落,然后输出\n\n
。
尝试生成比Perl更短的代码没有意义!
从列表group
中的输入文件中收集行,直到出现空行。然后输出group
的内容,清空它并重新开始。遇到文件结尾时输出group
中的任何内容,如果它是非空的。
group = []
with open('vollschauer.txt') as vollschauer:
for line in vollschauer:
line = line.rstrip()
if line:
group.append(line)
else:
if group:
print (' '.join(group))
print()
group = []
if group:
print (' '.join(group))
group = []
$ awk -v RS= -v ORS='\n\n' '{$1=$1}1' file
#Msg,00000
#Msg,00001 #Msg,00002
#Msg,00003 #Msg,00004
#Msg,00005
#Msg,00006 #Msg,00007 #Msg,00008
#Msg,00009
#Msg,00010 #Msg,00011
如果你坚持使用sed
,这应该可以解决问题:
sed -r ':a; N; /^(#[^,]+,).*\n\1/! { P; D }; s/\n/ /; ba' file
它需要考虑不同的标签。这些标签不会组合在一起(这就是我所理解的所需行为):
$ cat file
#Msg,00000
#Msg,00001
#Hello,00002
#Hello,00003
#What,00004
#What,00005
$ sed -r ':a; N; /^(#[^,]+,).*\n\1/! { P; D }; s/\n/ /; ba' file
#Msg,00000 #Msg,00001
#Hello,00002
#Hello,00003
#What,00004 #What,00005
请注意,此解决方案使用GNU sed
。