Usando os primeiros [N] caracteres ao verificar se há duplicatas

1

Eu tenho um conjunto de dados no arquivo:

AAAPOL.0001  
AAAPOL.0002  
AAAPRO.0001  
AAAPRO.0002  
AAAPRO.0003  
AAAPRO.0004  
AAAXEL.0002  
AAAJOK.1111  
AAAJOK.2222

Eu só preciso da primeira ocorrência usando o padrão dos primeiros 6 caracteres, então preciso saber como verificar a duplicidade / unicidade que corresponderá apenas aos primeiros 6 caracteres.

O comando deve retornar isso dos dados acima:

AAAPOL.0001   
AAAPRO.0001   
AAAXEL.0002   
AAAJOK.1111 

Eu não tenho acesso à opção uniq -w .

    
por Ryan Arellano 13.10.2016 / 07:20

2 respostas

1

Se você não se importar com a ordem das linhas a serem alteradas, você pode usar sort -u com a chave de ordenação definida para os 6 primeiros caracteres:

sort -u -k 1,1.6

Ou para a parte antes do . :

sort -t . -u -k 1,1
    
por 13.10.2016 / 10:50
1

Usando o awk

Nos seus exemplos, os primeiros seis caracteres são seguidos por um período. Se isso é sempre verdade, então:

$ awk -F. '!c[$1]++' File
AAAPOL.0001
AAAPRO.0001
AAAXEL.0002
AAAJOK.1111

Isso funciona usando . como um separador de campo e acompanhando o número de vezes que o primeiro campo já apareceu.

Se esse não for o caso, então:

$ awk '!c[substr($0, 1, 6)]++' File
AAAPOL.0001
AAAPRO.0001
AAAXEL.0002
AAAJOK.1111

substr($0, 1, 6) são os primeiros seis caracteres da linha. A matriz associativa c registra o número de vezes que vimos esses seis primeiros caracteres. Assim, se c[substr($0, 1, 6)] for diferente de zero, já vimos esses caracteres e a linha não deve ser impressa. No awk, diferente de zero significa verdadeiro. Então, invertemos o teste com ! : isso significa que !c[substr($0, 1, 6)] é verdadeiro se esses seis caracteres não tiverem sido vistos antes. O ++ à direita atualiza a contagem em c antes de ler a próxima linha.

Usando o uniq

Para referência para aqueles que, ao contrário do OP, têm acesso a uma versão de uniq com a opção -w , então:

$ uniq -w6 File
AAAPOL.0001
AAAPRO.0001
AAAXEL.0002
AAAJOK.1111
    
por 13.10.2016 / 07:32

Tags