Другой превосходный инструмент для двунаправленной синхронизации..... freefilesync
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
$
(или, становясь более кратким с ним, потому что ответ Chris Down, настолько сладкий)
awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++ {print $1,$2}'
который мог быть далее уменьшен, если Вы не заботитесь о пробелах в Ваших данных
awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++'
)
FS
переменная "разделителя полей" awk, используемый здесь для гарантирования нерушимость границ между полями ключа будет правильно определен. Мой оригинал сделал, чтобы они работали вместе, $1$2
, то, на которое, поскольку указал Stephane Chazelas, будет рассматривать A BC
и AB C
как дубликаты.
В Perl:
perl -lane 'print if !$seen{join(" ", sort @F)}++'
Это работает путем сортировки и присоединения к полям (таким образом, "C" стал бы ключевым "C"), и добавление их к $seen
. Это только распечатает первое вхождение, потому что условное предложение только будет верно, когда это оценит для обнуления (который только произойдет в первый раз, когда с этим сравнением встречаются, из-за постинкремента).
Если Вы не хотите сохранить порядок элементов на уникальной строке, то можно отсортировать каждую строку, то вид строки и удаляет дубликаты.
awk '{ if ($2 < $1) print $2, $1; else print $1, $2; }' | sort -u
awk
? – jasonwryan 18.11.2013, 19:28FS
использование теперь, там что-либо еще? – jthill 18.11.2013, 19:38