Eu tenho um arquivo com uma coluna com nomes que se repetem várias vezes cada. Quero condensar cada repetição em uma, enquanto mantenho quaisquer outras repetições com o mesmo nome que não sejam adjacentes a outras repetições com o 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
Isto é o que tenho usado: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt
No entanto, este método mantém apenas 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?
uniq
fará isso por você:Awk
solução:A saída:
Tente isto - salve a linha anterior e compare com a linha atual
Você também marcou
uniq
- você tentou?Com o sed pode ser feito da seguinte forma:
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 voltamos e acrescentamos a próxima linha no espaço do padrão. Enxágue... repita
Utilizando Perl no modo slurp, tratamos o arquivo inteiro como uma string longa na qual o regex é aplicado, o que faz a comparação para você.
Pergunta sobre a solução sed de Rakesh Sharma.
E se você tiver um arquivo de entrada como:
E você quer que um arquivo de saída seja:
Observe a falta:
Eu sei que o comando que eu quero é semelhante à sua solução:
Não é possível alterá-lo da maneira correta para imprimir as duas colunas e apenas ser classificado dessa maneira especial com os valores da coluna 2. Alguma dica?