uniq
fará isso por você:
$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna
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?
Awk
solução:
awk '$1 != name{ print }{ name = $1 }' file.txt
A saída:
Golgb1
Akna
Spata20
Golgb1
Akna
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
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
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?