Unix, comment joindre des lignes commençant par 15 chiffres

J’ai un fichier comme celui-ci:

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 

Je veux avoir ce résultat, en commençant chaque ligne avec ceux qui commencent par 15 chiffres, et en remplaçant les fins de ligne intermédiaires par un espace:

 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 

C’est possible?

J’aime mieux ma solution: pas de twigs et pas de 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 
  • Définissez le séparateur sur une nouvelle ligne chaque fois que vous faites correspondre le modèle à 15 chiffres, sauf sur la ligne 1.
  • Imprimez une ligne en entrée avec un séparateur en tête et définissez le séparateur sur un espace.
  • Imprimez une nouvelle ligne à la fin.

Tu peux faire:

 $ 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 

peut être simplifié avec l’aide de 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 

Cela pourrait fonctionner pour vous (GNU sed):

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

Remplacez une nouvelle ligne par un espace sauf si cette nouvelle ligne précède un nombre de 15 caractères.