removendo a redundância das colunas de saída

5

O que é uma maneira * NIX de remover a redundância em um caso em que eu tenho comparações emparelhadas como essas em duas colunas

    A B
    B A
    A C
    A D
    C A
    D A 
    B C
    C B

A B e B A representam a mesma comparação e gostaria de remover essa redundância do conjunto de dados. O resultado final deve ser

A B
A C
A D
B C
    
por eastafri 18.11.2013 / 15:18

3 respostas

7
doit () 
{ 
    awk '{
           key=$1<=$2? $1 FS $2 : $2 FS $1; 
           if (!seen[key]) print $1,$2
           seen[key]=1
    }'
}
$ doit <test
A B
A C
A D
B C
$

(ou, ficando mais tenso com isso, porque a resposta de Chris Down é tão doce)

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++ {print $1,$2}'

que pode ser reduzido ainda mais se você não se importar com os espaços em seus dados

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++'

A FS é a variável "separador de campos" do awk, usada aqui para garantir que os limites entre os campos-chave sejam identificados adequadamente. Meu original os fez correr juntos, $1$2 , o que, como Stephane Chazelas apontou, teria tratado A BC e AB C como duplicatas.

    
por 18.11.2013 / 15:39
5

Em Perl:

perl -lane 'print if !$seen{join(" ", sort @F)}++'

Isso funciona classificando e unindo os campos (assim, "C A" se tornará a chave "A C") e adicionando-os a $seen . Ele só imprimirá a primeira ocorrência, porque a cláusula condicional só será verdadeira quando for avaliada como zero (o que ocorrerá somente na primeira vez que essa comparação for encontrada, devido ao pós-incremento).

    
por 18.11.2013 / 15:40
2

Se você não se importa em preservar a ordem dos elementos em uma única linha, você pode classificar cada linha, classificar as linhas e remover as duplicatas.

awk '{ if ($2 < $1) print $2, $1; else print $1, $2; }' | sort -u
    
por 19.11.2013 / 00:50