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.