-2

У меня есть задача. Я должен соединить файлы A:B.dsv, B:D.dsv и N:A.dsv. Столбцы разделены знаком «:». И я должен присоединиться по отношению N:D.

И сортировать конечный файл по D.

A:B.dsv:

R0X 7M3:48B56
L6R 5X3:08P68
E1W 4Q1:26N92
E2O 5I3:10F41
H2S 6G2:24W77
P6A 9S0:12D69
B9B 0K3:83U99
N1H 5L4:21P31
D0T 3W4:02F82
Y8A 2B7:08O10
J7B 8T3:05P26
A7P 7U4:39M76
M7D 5I8:58J55
O2E 1I9:42U04
G2I 0V1:43S37
F0Y 0P6:07I98
X0E 2N0:20S71
M0K 2P2:86R47
O0E 5G3:78J91
C5W 4V0:02F49
J0G 2A1:56Z45
V9Z 1S8:56Z27
C8K 4T8:58O04
Q0U 4K8:98H68
Z3K 4R3:94A07

Б:D:

10F41:26.01.14
39M76:30.03.12
83U99:28.11.12
58J55:30.03.12
86R47:28.11.12
21P31:03.04.12
56Z45:03.04.12
94A07:13.05.13
05P26:28.11.12
02F49:26.01.14
56Z27:13.05.13
20S71:28.11.12
08P68:30.03.12
24W77:26.01.14
12D69:03.04.12
26N92:03.04.12
98H68:13.05.13
78J91:03.04.12
02F82:13.05.13
58O04:30.03.12
08O10:26.01.14
48B56:26.01.14
07I98:30.03.12
43S37:28.11.12
42U04:13.05.13

N:A.dsv:

Zia:C5W 4V0
Moana:E2O 5I3
Grace:G2I 0V1
Moana:A7P 7U4
Joy:F0Y 0P6
Grace:O0E 5G3
Cameran:Q0U 4K8
Cameran:J0G 2A1
Zia:J7B 8T3
Grace:M0K 2P2
Cameran:L6R 5X3
Zia:O2E 1I9
Cameran:Y8A 2B7
Joy:D0T 3W4
Moana:Z3K 4R3
Joy:N1H 5L4
Grace:R0X 7M3
Cameran:E1W 4Q1
Moana:M7D 5I8
Zia:B9B 0K3
Grace:C8K 4T8
Moana:P6A 9S0
Joy:V9Z 1S8
Zia:H2S 6G2

1 ответ1

0

Ваш формат даты делает сортировку немного сложнее. Вот то, что я думаю, вы хотите:

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 {FS=OFS=":"} {print $2,$1}'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 {FS = OFS = ":"} {print $2,$1}'

Второе соединение печатает отношение 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .