Eu tenho um arquivo com uma coluna com nomes que se repetem várias vezes cada. Quero condensar cada repetição em uma, mantendo 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 eu tenho usado: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt
No entanto, esse 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?
sort | uniq
sort -u
(:Awk
solução:A saída:
fonte
Tente isso - salve a linha anterior e compare com a linha atual
Você marcou
uniq
também - você experimentou?fonte
Com o sed, isso pode ser feito da seguinte maneira:
Aqui temos no espaço do padrão a qualquer momento 2 linhas. Quando a comparação falha, imprimimos o primeiro e cortamos de frente, voltamos e acrescentamos a próxima linha ao espaço do padrão. Enxágüe ... repita
Utilizando Perl no modo slurp, tratamos o arquivo inteiro como uma sequência longa na qual o regex é aplicado, o que faz a comparação para você.
fonte
Pergunta sobre a solução sed de Rakesh Sharma.
E se você tiver um arquivo de entrada como:
E você deseja 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?
fonte
sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D'
excluirá os elementos repetidos subsequentes. Nota: Isso requerGNU sed
. Para oPOSIX
comportamento, ele precisa de uma ligeira alteração.