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

Unix,如何连接以15个数字开头的行,unix,awk,sed,Unix,Awk,Sed,我有这样一个文件: 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
我希望得到这样的结果,从每一行开始,以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
这可能适用于您(GNU-sed):


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

我最喜欢我的解决方案:没有分支和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行除外
  • 使用前导分隔符打印任何输入行,并将分隔符设置为空格
  • 在末尾打印一个换行符
好极了!感谢提示:对于较旧的gawk版本<4,您可能需要使用
--re interval
--posix
来使用区间表达式
{15}
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