Mantendo linhas exclusivas com base em informações de 2 de três colunas

6

Suponha que você tenha um arquivo como este:

NW_006521251.1  428 84134
NW_006521251.1  511 84135
NW_006521038.1  202 84155
NW_006521038.1  1743 84153
NW_006521038.1  1743 84154
NW_006520495.1  198 84159
NW_006520086.1  473 84178
NW_006520086.1  511 84180

Eu quero manter as linhas exclusivas com base nas colunas 1 e 2 (ou seja, não apenas na coluna dois, pois esse número pode se repetir em um rótulo diferente na coluna um).

De modo que recebo isso como saída (remove a segunda repetição de NW_006521038.1 1743 da lista):

    NW_006521251.1  428 84134
    NW_006521251.1  511 84135
    NW_006521038.1  202 84155
    NW_006521038.1  1743 84153
    NW_006520495.1  198 84159
    NW_006520086.1  473 84178
    NW_006520086.1  511 84180

Existe uma maneira de fazer isso com o awk? Usar uniq file não funciona.

    
por Age87 23.04.2018 / 19:19

2 respostas

13

Há um idioma famoso "awk" exatamente para isso. Você quer fazer:

awk '!seen[$1,$2]++' file

Isso cria um array associativo "visto" com as 2 colunas como chave. Use o operador de pós-incremento para que, pela primeira vez que você encontrar essa chave, o valor seja zero. O uso do operador de negação para um resultado "verdadeiro" na primeira vez que você ver a chave.

    
por 23.04.2018 / 19:28
4

Se você não se importa que a saída seja classificada:

sort -u -k1,2 file
  • -u - exclusivo
  • -k1,2 - use os campos 1 e 2 juntos como chave
por 24.04.2018 / 00:35

Tags