Remover linhas duplicadas adjacentes enquanto mantém o pedido

9

Eu tenho um arquivo com uma coluna com nomes que se repetem um número de vezes cada. Quero condensar cada repetição em uma, mantendo quaisquer outras repetições de mesmo nome que não sejam adjacentes a outras repetições de mesmo nome.

Por exemplo Eu quero virar o lado esquerdo para o lado direito:

Golgb1    Golgb1    
Golgb1    Akna
Golgb1    Spata20
Golgb1    Golgb1
Golgb1    Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna

Isso é o que eu tenho usado: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt No entanto, este método apenas mantém um representante da esquerda (ou seja, Golb1 e Akna não são repetidos).

Existe uma maneira de manter nomes exclusivos para cada bloco, mantendo nomes que se repetem em vários blocos não adjacentes?

    
por Age87 23.04.2018 / 17:30

5 respostas

23

uniq fará isso por você:

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna
    
por 23.04.2018 / 17:40
9

Awk solução:

awk '$1 != name{ print }{ name = $1 }' file.txt

A saída:

Golgb1
Akna
Spata20
Golgb1
Akna
    
por 23.04.2018 / 17:39
6

Tente isto - salve a linha anterior e compare com a linha atual

$ perl -ne 'print if $p ne $_; $p=$_' ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

Você também marcou uniq - você tentou?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna
    
por 23.04.2018 / 17:37
0

Com sed pode ser feito da seguinte forma:

sed -e '$!N;/^\(.*\)\n$/!P;D' input_file

Aqui temos no espaço padrão a qualquer momento 2 linhas. Quando a comparação entre eles falha, imprimimos o primeiro e cortamos na frente e volte e anexe a próxima linha ao espaço padrão. Enxaguar ... repita

Utilizando o Perl no modo slurp, tratamos o arquivo inteiro como um longo string na qual o regex é aplicado, o que faz a comparação para você.

perl -0777pe 's//$1/ while /^(.*\n)+/gm' input_file
    
por 26.04.2018 / 14:46
0

Pergunta sobre a solução sed de Rakesh Sharma.

E se você tiver um arquivo de entrada como:

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.118 48.216
-126.128 48.222
-126.136 48.226

E você quer que um arquivo de saída seja:

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.128 48.222
-126.136 48.226

Observe a falta:

-126.118 48.216

Sei que o comando que quero é semelhante à sua solução:

sed -e '$!N;/^\(.*\)\n$/!P;D' input_file

Não é possível alterá-lo da maneira correta para imprimir ambas as colunas e apenas ser classificado dessa maneira especial com os valores da coluna 2. Alguma dica?

    
por 28.06.2018 / 01:55

Tags