Existe um comando para adicionar nova linha em um arquivo de texto se o valor dessa linha for diferente do próximo?

3

Eu tenho um arquivo que é classificado usando sort -n. No entanto, para fazer um gráfico de superfície no gnuplot, eu preciso que haja uma linha em branco entre as linhas com valores diferentes da primeira coluna. por exemplo

1.0
1.0
1.1
1.1

para:

1.0
1.0

1.1
1.1

Existe alguma maneira de fazer isso facilmente com o Ubuntu Linux?

    
por A.TJE 21.06.2017 / 13:30

2 respostas

5

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).

    
por 21.06.2017 / 14:00
3

Algo parecido pode fazer o trabalho:

awk 'BEGIN {A=""} {if ($0!=A) { printf "\n%s\n", $0; A=$0} else print $0}'

Tenha cuidado ao escolher o valor de inicialização de A para não estar nos valores existentes

    
por 21.06.2017 / 13:35