$ awk -F'[ ;]' '
{ key=($1 > $2 ? $1 FS $2 : $2 FS $1) }
NR==FNR { a[key]; next }
key in a
' file1 file2
Mike Tyson;mike@tyson.com;45753
Cruise Tom;tom@cruise.com;23562
Вышеупомянутый использует общий, идиоматический c подход к генерации согласованного ключа независимо от порядка, в котором появляются ключевые компоненты, путем сортировки компонентов перед их объединением для создания значения ключа. Когда есть только 2 компонента, как в этом случае, простое сравнение - единственная необходимая сортировка.
Вот почему сортировка компонентов ключа - правильный подход. Представьте, что у вас есть 3 компонента, 1, 2 и 3 доллара, а не только 2. При подходе к тестированию каждой комбинации вам нужно следующее:
NR==FNR { a[$1,$2,$3]; next }
($1,$2,$3) in a || ($1,$3,$2) in a || ($2,$1,$3) in a ||
($2,$3,$1) in a || ($3,$1,$2) in a || ($3,$2,$1) in a
Попробуйте написать это условие для 1–4 долларов :-).
Напротив, если вы используете подход сортировки компонентов, которые вам нужны (с использованием GNU awk для встроенных функций сортировки для удобства), что НАМНОГО труднее ошибиться (например, если забыть комбинацию при сравнении):
NR==FNR {
split($1 FS $2 FS $3,flds)
asort(flds)
key = flds[1]
for (i=2; i in flds; i++) {
key = key FS flds[i]
}
a[key]
next
}
key in a
А теперь представьте, хотите ли вы использовать от 1 до 10 долларов в любом порядке. Подход «тестируйте каждую комбинацию компонентов» становится невыносимым кошмаром, в то время как подход «отсортируйте компоненты для создания ключа» просто означает тривиальное добавление полей в список в первом аргументе split ().