Este encantamento mágico é um famoso idioma awk:
awk '!seen[$1]++' file
Na primeira vez que uma linha com esse $ 1 é vista, a linha é impressa.
Eu tenho um arquivo classificado com linhas como esta
word1 abca
word1 abcb
word1 abcc
word2 abca
word2 abcb
word3 abbb
...........
e eu quero ter algo parecido com isso
word1 abca
word2 abca
word3 abbb
...........
Uma solução awk - usando uma variável para detectar uma nova palavra. Se uma nova palavra for encontrada, imprima a linha e atribua a variável à palavra atual.
Como o arquivo de dados é classificado, somente a primeira ocorrência de cada palavra imprimirá o registro.
awk 'BEGIN{w=""} w!=$1 {print;w=$1}' your-file
Você também pode usar o sinal -w
de uniq
, que informa apenas os primeiros N caracteres. Os detalhes de se isso funcionará para você dependem dos dados reais, mas se os comprimentos das palavras estiverem definidos ou limitados, isso deve funcionar:
$ sort file.txt | uniq -w 5
word1 abca
word2 abca
word3 abbb
Alternativamente, inverta a ordem dos campos e use uniq -f 1
para pular a comparação do primeiro campo:
$ awk '{print $2,$1}' file.txt | uniq -f 1 | awk '{print $2,$1}'
word1 abca
word2 abca
word3 abbb
Ou obtenha os primeiros campos e, em seguida, grep
para eles, limitando a pesquisa à primeira correspondência:
$ for i in $(awk '{print $1}' file.txt | sort -u); do grep -m 1 $i file.txt; done
word1 abca
word2 abca
word3 abbb
E, para fins de conclusão, um Perl:
$ perl -ane 'print if $k{$F[0]}++<1' file.txt
word1 abca
word2 abca
word3 abbb