Ваш формат даты делает сортировку немного сложнее. Вот то, что я думаю, вы хотите:
join -t : -1 2 -2 1 <(sort -t: -k2 A:B.dsv) <(sort B:D.dsv) | join -t : -j 2 -o 2.1,1.3 <(sort -t: -k2 -) <(sort -t: -k2 N:A.dsv) | perl -E ' chomp(@lines = <>); say join "\n", map {$_->[1]} sort {$a->[0] <=> $b->[0]} map {@d = split /[.]/, (split /:/)[1]; [ $d[2].$d[1].$d[0], $_ ]} @lines '
выходы:
Moana:30.03.12 Grace:30.03.12 Joy:30.03.12 Cameran:30.03.12 Moana:30.03.12 Camerawk 'BEGIN 'an:03.04.12 Cameran:03.04.12 Joy:03.04.12 Grace:03.04.12 Moana:03.04.12 Zia:28.11.12 Grace:28.11.12 Zia:28.11.12 Grace:28.11.12 Joy:13.05.13 Zia:13.05.13 Cameran:13.05.13 Joy:13.05.13 Moana:13.05.13 Zia:26.01.14 Moana:26.01.14 Zia:26.01.14 Grace:26.01.14 Cameran:26.01.14
Я мог бы потратить немало времени, чтобы разобраться в этом, но поэкспериментировал с каждой частью конвейера, чтобы увидеть, как он создается.
Без perl:
join -t : -1 2 -2 1 <(sort -t: -k2 A:B.dsv) <(sort B:D.dsv) | join -t : -j 2 -o 1.3,2.1 <(sort -t: -k2 -) <(sort -t: -k2 N:A.dsv) | sort -t. -k3,3n -k2,2 -k1,1 | awk 'BEGIN '
Второе соединение печатает отношение D: N, сортирует по дате, затем использует awk для реверсирования полей. Дополнительным побочным эффектом является то, что выходные данные также сортируются по имени.
Cameran:30.03.12 Grace:30.03.12 Joy:30.03.12 Moana:30.03.12 Moana:30.03.12 Cameran:03.04.12 Cameran:03.04.12 Grace:03.04.12 Joy:03.04.12 Moana:03.04.12 Grace:28.11.12 Grace:28.11.12 Zia:28.11.12 Zia:28.11.12 Cameran:13.05.13 Joy:13.05.13 Joy:13.05.13 Moana:13.05.13 Zia:13.05.13 Cameran:26.01.14 Grace:26.01.14 Moana:26.01.14 Zia:26.01.14 Zia:26.01.14
Сортировка будет намного проще, если вы используете стандартный формат даты ГГГГ-ММ-ДД:
join -t : -1 2 -2 1 <(sort -t: -k2 A:B.dsv) <(sort B:D.dsv) | join -t : -j 2 -o 2.1,1.3 <(sort -t: -k2 -) <(sort -t: -k2 N:A.dsv) | sort -t: -k2