Ihr Datumsformat macht die Sortierung etwas schwieriger. Ich denke, Sie wollen:
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 '
Ausgänge:
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
Ich könnte eine Menge Zeit damit verbringen, das zu brechen, aber experimentiere mit jedem Teil der Pipeline, um zu sehen, wie er aufgebaut wird.
Ohne 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 '
Die 2. Verknüpfung druckt die D: N-Beziehung, sortiert nach Datum und verwendet dann awk, um die Felder umzukehren. Ein zusätzlicher Nebeneffekt ist, dass die Ausgabe auch nach Namen sortiert wird.
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
Die Sortierung wäre viel einfacher, wenn Sie ein Standard-Datumsformat JJJJ-MM-TT verwenden:
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