我正在处理一项任务,在Unix中操作文本,但我不知道我将如何做.我打算用sed.这是我想做的事.
我有这个文字.
BS111
xxxxx
yyyyy
zzzzz
BS112
xxxxx
yyyyy
zzzzz
BS113
xxxxx
yyyyy
zzzzz
so on.. with this kind of format
我希望它像:
BS111 xxxxx
BS111 yyyyy
BS111 zzzzz
BS112 xxxxx
BS112 yyyyy
BS112 zzzzz
BS113 xxxxx
BS113 yyyyy
BS113 zzzzz
so on.. with this kind of format
BS *及其数据几乎发生了数百次.所以我认为最好的方法是使用脚本.预先感谢您的帮助.
解决方法:
试试awk
awk’/ ^ BS / {i = $0; next;} {if(length($0))printf(“%s”,i); print $0}’< filename>
更新:
“/ ^ BS / {I = $0; next;} {if(length($0))printf(“%s”,i);打印$0}’记住,在awk中,{…}表示一组动作. / pattern / {…}表示如果找到模式,请执行{…}操作.
/ ^ BS [0-9] /将在每一行中搜索模式.如果找到模式,i(awk中的变量)将使用模式更新($0是完整行),接下来将立即移动到下一行.如果{if(…}中的下一组操作将被跳过,如果找到一个模式.所以我将始终包含最后一个模式值,如果一行包含模式,除了更新i之外,该行的下一组动作将不会发生.
下一组操作是if(length($0))if,该行包含text,printf(“%s”,i);打印最后找到的模式,然后打印$0prints原始行.因此,对于空行,只打印一个空行,如果有一些文本,则首先打印theiorlast found pattern,然后打印原始行.顺便说一下,sputnick的解决方案也在做同样的事情,只是以更紧凑的形式.所以你也可以解剖那个也是为了好玩.希望我很清楚,请随时询问您需要知道的任何事情
标签:linux,sed,unix
来源: https://codeday.me/bug/20190723/1509729.html