Verbinden Sie einige Dateien in Bash

361
diego9403

Ich habe eine aufgabe Ich muss die Dateien A: B.dsv, B: D.dsv und N: A.dsv zusammenfügen. Spalte sind durch ':' getrennt. Und ich muss durch die Beziehung N: D beitreten.

Und sortiere die Enddatei nach 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 

B: 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
Können Sie vielleicht 2-3 Zeilen verwenden, um anzugeben, wie die endgültige Ausgabe aussehen soll? bertieb vor 8 Jahren 0
Einige Fragen: - 1. Sollte die mittlere Datei B: D.dsv sein? 2. Was meinen Sie mit "Join by Relation N: D"? 3. Was meinen Sie mit "sort end file by D"? Dem würde ich den Kommentar von @bertieb hinzufügen. AFH vor 8 Jahren 1

1 Antwort auf die Frage

0
glenn jackman

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 
Ist dies ohne Prel möglich? diego9403 vor 8 Jahren 0
Dies ist die Aufgabe meines Studiums und in unseren Klassen haben wir nicht in Perl geschrieben. Ich würde gerne diese Programmiersprache kennen, aber vielleicht jetzt nicht. Kannst du mir sagen, was dieses Programm in Perl macht? diego9403 vor 8 Jahren 0
Das Datumsfeld wird zuerst nach Jahr, dann nach Monat und dann nach Tag sortiert. Ich werde eine Alternative anbieten glenn jackman vor 8 Jahren 0
Vielen Dank. Aber ich habe eine Frage. Was bedeutet "-" (sortiert)? diego9403 vor 8 Jahren 0
Viele Unix-Befehle tun dies: "Lesen aus stdin" anstatt aus einer benannten Datei zu lesen. glenn jackman vor 8 Jahren 0