Присоединяйтесь к некоторым файлам в Bash

277
diego9403

У меня есть задача. Я должен соединить файлы 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 
-2
Можете ли вы использовать 2-3 строки, чтобы указать, как должен выглядеть конечный результат? bertieb 9 лет назад 0
Некоторые вопросы: - 1. Должен ли средний файл быть B: D.dsv? 2. Что вы подразумеваете под «соединением по отношению N: D»? 3. Что вы подразумеваете под "сортировать конечный файл по D"? К которому я бы добавил комментарий @ bertieb. AFH 9 лет назад 1

1 ответ на вопрос

0
glenn jackman

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

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 
Есть ли возможность сделать это без Прела? diego9403 9 лет назад 0
Это задача моих занятий, и на наших уроках мы не писали на Perl. Я хотел бы знать этот язык программирования, но, возможно, не сейчас. Так не могли бы вы сказать мне, что делает эта программа на Perl? diego9403 9 лет назад 0
Он сортирует поле даты сначала по году, затем по месяцу, а затем по дню. Я предоставлю альтернативу glenn jackman 9 лет назад 0
Спасибо. Но у меня есть один вопрос. Что означает «-» (в виде)? diego9403 9 лет назад 0
Многие команды Unix делают это: это означает «чтение из стандартного ввода» вместо чтения из именованного файла. glenn jackman 9 лет назад 0

Похожие вопросы