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
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
.
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
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.
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
Tags uniq