Isso pode ser feito com o awk idiomático assim:
awk '$1=$1' RS= OFS= infile
Saída:
timestamp=201706291035.....;line 2;line 3;line 4;line 5;line 6;line 7;
timestamp=201706291038.....;line 2;line 3;line 4;line 5;line 6;
Explicação
Há muita coisa embalada aqui. Basicamente, existem três etapas:
- Primeiro, a entrada é dividida em registros com base no separador de registro (
RS
). - Cada registro é dividido em campos com base no separador de campos (
FS
). - Ao imprimir, o separador do campo de saída (
OFS
) é usado como o delimitador de campo.
Quando o awk analisa sua entrada, existem várias regras implícitas no trabalho. Os dados são lidos, um registro por vez, sendo os registros separados por RS
(o padrão é \n
). Quando RS
está vazio, como no exemplo acima, uma linha vazia delimita registros. Assim, cada seção é lida como um registro.
Para forçar awk
a substituir FS
por OFS
, definimos o primeiro campo $1
para si mesmo.
Editar
Como observado por steeldriver , o OP quer remover o ponto-e-vírgula à direita. Sem vergonha copiada:
awk '{ sub(/;$/,"",$NF); $1=$1 } 1' RS= OFS= infile