Eu escrevia:
awk 'NR > 1 && $0 != last {print ""}
{print; last = $0}' < your-file
Observe que, contanto que as linhas consistam em números, essa $0 != last
será uma comparação numérica , para a qual 1.0
é igual a 1
ou 1e0
ou 1.00
(embora não necessariamente 0x1, e também cuidado com o efeito potencial da localidade em relação ao tratamento do separador decimal (1,0 vs 1,0)). Se você quiser garantir uma comparação lexical, altere para $0 "" != last
.
Dependendo da implementação de awk
, isso aplicará um memcmp()
(comparação de byte a byte), strcmp()
(mesmo, mas não pode manipular bytes NUL), strcoll()
(se os dois strings classificam a mesma) ou wcsncmp()
(caractere-para-caractere ao contrário de byte para byte) comparação (todos os quais devem ser equivalentes se sua entrada consistir apenas de dígitos decimais e caracteres de período).
Se você quiser forçar a comparação byte a byte, corrija a localidade para C:
LC_ALL=C awk 'NR > 1 && $0 "" != last {print ""}
{print; last = $0}' < your-file
(mais uma vez, algumas implementações de awk
irão engasgar com o caractere NUL).