Unix,如何连接以 15 个数字开头的行



>我有一个这样的文件:

123456789012345lksdlkssalkd
skdañsldkasñldkas+
slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf
 ASLÑsa sLL SLD   SdsDA
SLDALDK LÑD
SDFSADF
d
345678901234560   DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf
lfdld

我想要这个结果,每行以 15 个数字开头,并用空格替换中间行尾:

123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf  ASLÑsa sLL SLD   SdsDA SLDALDK LÑD SDFSADF d
345678901234560   DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf lfdld

可能吗?

你可以做:

$ awk '/^[[:digit:]]{15}/{if (buf) {print buf} buf=$0; next} 
                        {buf=buf FS $0} 
       END              {print buf}' file
123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf  ASLÑsa sLL SLD   SdsDA SLDALDK LÑD SDFSADF d
345678901234560   DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf lfdld

可以在sed的帮助下简化

$ sed -r 's/[0-9]{15}/n&/' file | 
  awk -v RS= -v ORS='n' '$1=$1'
123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf ASLÑsa sLL SLD SdsDA SLDALDK LÑD SDFSADF d
345678901234560 DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf lfdld

我最喜欢我的解决方案:没有分支,没有 sed,

awk '/^[0-9]{15}/ && NR > 1 {sep="n"} 
     {printf "%s%s", sep, $0; sep = " "} END {print ""}' dat
123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl 
012345678901234dkfskadflkdflkasdf  ASLÃsa sLL SLD   SdsDA SLDALDK LÃD SDFSADF d 
345678901234560   DÃLSAD SDLÃSlkfl fg fg kfglkfgklfd gf lfdld 
  • 只要匹配 15 位模式,请将分隔符设置为换行符,第 1 行除外。
  • 打印任何带有前导分隔符的输入行,并将分隔符设置为空格。
  • 在末尾打印换行符。

这可能对你有用(GNU sed(:

sed -r ':a;N;/n[0-9]{15}/!s/n/ /;ta;P;D' file
将换行

符替换为空格,除非该换行符前面有 15 个字符。

最新更新