Πώς να χρησιμοποιήσετε την εντολή join στο Linux

Εάν θέλετε να συγχωνεύσετε δεδομένα από δύο αρχεία κειμένου ταιριάζοντας ένα κοινό πεδίο, μπορείτε να χρησιμοποιήσετε την εντολή σύνδεσης Linux. Προσθέτει δυναμισμό στα στατικά αρχεία δεδομένων σας. Θα σας δείξουμε πώς να το χρησιμοποιήσετε.

Αντιστοίχιση δεδομένων σε αρχεία

Τα δεδομένα είναι βασιλιάς. Οι εταιρείες, οι επιχειρήσεις και τα νοικοκυριά λειτουργούν με αυτό. Αλλά τα δεδομένα που είναι αποθηκευμένα σε διαφορετικά αρχεία και συγκεντρώνονται από διαφορετικούς ανθρώπους είναι ένας πόνος. Εκτός από το να γνωρίζετε ποια αρχεία να ανοίξετε για να βρείτε τις πληροφορίες που θέλετε, η διάταξη και η μορφή των αρχείων είναι πιθανό να διαφέρουν.

Πρέπει επίσης να αντιμετωπίσετε τον διοικητικό πονοκέφαλο σχετικά με το ποια αρχεία πρέπει να ενημερωθούν, ποια πρέπει να δημιουργηθούν αντίγραφα ασφαλείας, ποια είναι παλαιού τύπου και ποια μπορούν να αρχειοθετηθούν.

Επιπλέον, εάν χρειάζεται να ενοποιήσετε τα δεδομένα σας ή να κάνετε κάποια ανάλυση σε ένα ολόκληρο σύνολο δεδομένων, έχετε ένα επιπλέον πρόβλημα. Πώς εξορθολογίζετε τα δεδομένα στα διάφορα αρχεία προτού μπορέσετε να κάνετε ό,τι πρέπει να κάνετε με αυτά; Πώς προσεγγίζετε τη φάση προετοιμασίας δεδομένων;

Τα καλά νέα είναι ότι εάν τα αρχεία μοιράζονται τουλάχιστον ένα κοινό στοιχείο δεδομένων, η εντολή σύνδεσης Linux μπορεί να σας βγάλει από το βούρκο.

Τα Αρχεία Δεδομένων

Όλα τα δεδομένα που θα χρησιμοποιήσουμε για να δείξουμε τη χρήση της εντολής join είναι φανταστικά, ξεκινώντας με τα ακόλουθα δύο αρχεία:

cat file-1.txt
cat file-2.txt

Τα περιεχόμενα του

Ακολουθούν τα περιεχόμενα του file-1.txt:

1 Adore Varian [email protected] Female 192.57.150.231
2 Nancee Merrell [email protected] Female 22.198.121.181
3 Herta Friett [email protected] Female 33.167.32.89
4 Torie Venmore [email protected] Female 251.9.204.115
5 Deni Sealeaf [email protected] Female 210.53.81.212
6 Fidel Bezley [email protected] Male 72.173.218.75
7 Ulrikaumeko Standen [email protected] Female 4.204.0.237
8 Odell Jursch [email protected] Male 1.138.85.117

Έχουμε ένα σύνολο αριθμημένων γραμμών και κάθε γραμμή περιέχει όλες τις ακόλουθες πληροφορίες:

Ενας αριθμός
Ένα πρώτο όνομα
Ένα επώνυμο
Μια διεύθυνση email
Το φύλο του ατόμου
Μια διεύθυνση IP

Ακολουθούν τα περιεχόμενα του file-2.txt:

1 Varian [email protected]er.com Female Western New York $535,304.73
2 Merrell [email protected] Female Finger Lakes $309,033.10
3 Friett [email protected] Female Southern Tier $461,664.44
4 Venmore [email protected] Female Central New York $175,818.02
5 Sealeaf [email protected] Female North Country $126,690.15
6 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Standen [email protected] Female Capital District $674,634.93
8 Jursch [email protected] Male Hudson Valley $663,821.09

Κάθε γραμμή στο file-2.txt περιέχει τις ακόλουθες πληροφορίες:

Ενας αριθμός
Ένα επώνυμο
Μια διεύθυνση email
Το φύλο του ατόμου
Μια περιοχή της Νέας Υόρκης
Αξία σε δολάρια

Η εντολή join λειτουργεί με “πεδία”, τα οποία, σε αυτό το πλαίσιο, σημαίνει ένα τμήμα κειμένου που περιβάλλεται από κενά, την αρχή μιας γραμμής ή το τέλος μιας γραμμής. Για να ταιριάζουν οι γραμμές μεταξύ των δύο αρχείων, κάθε γραμμή πρέπει να περιέχει ένα κοινό πεδίο.

  3 τρόποι για να διαγράψετε με ασφάλεια έναν σκληρό δίσκο σε Linux

Επομένως, μπορούμε να αντιστοιχίσουμε ένα πεδίο μόνο εάν εμφανίζεται και στα δύο αρχεία. Η διεύθυνση IP εμφανίζεται μόνο σε ένα αρχείο, οπότε αυτό δεν είναι καλό. Το πρώτο όνομα εμφανίζεται μόνο σε ένα αρχείο, επομένως δεν μπορούμε να το χρησιμοποιήσουμε ούτε αυτό. Το επώνυμο υπάρχει και στα δύο αρχεία, αλλά θα ήταν κακή επιλογή, καθώς διαφορετικά άτομα έχουν το ίδιο επώνυμο.

Δεν μπορείτε να συνδέσετε τα δεδομένα με τις καταχωρήσεις ανδρών και γυναικών, επειδή είναι πολύ ασαφείς. Οι περιοχές της Νέας Υόρκης και οι τιμές του δολαρίου εμφανίζονται μόνο σε ένα αρχείο, επίσης.

Ωστόσο, μπορούμε να χρησιμοποιήσουμε τη διεύθυνση email επειδή υπάρχει και στα δύο αρχεία και το καθένα είναι μοναδικό για ένα άτομο. Μια γρήγορη ματιά στα αρχεία επιβεβαιώνει επίσης ότι οι γραμμές σε καθεμία αντιστοιχούν στο ίδιο άτομο, ώστε να μπορούμε να χρησιμοποιήσουμε τους αριθμούς των γραμμών ως πεδίο για να ταιριάξουμε (θα χρησιμοποιήσουμε διαφορετικό πεδίο αργότερα).

Σημειώστε ότι υπάρχει διαφορετικός αριθμός πεδίων στα δύο αρχεία, κάτι που είναι εντάξει—μπορούμε να πούμε να συνδέσουμε ποιο πεδίο να χρησιμοποιήσουμε από κάθε αρχείο.

Ωστόσο, προσέξτε για πεδία όπως οι περιοχές της Νέας Υόρκης. σε ένα αρχείο διαχωρισμένο με διάστημα, κάθε λέξη στο όνομα μιας περιοχής μοιάζει με πεδίο. Επειδή ορισμένες περιοχές έχουν ονόματα δύο ή τριών λέξεων, έχετε στην πραγματικότητα διαφορετικό αριθμό πεδίων στο ίδιο αρχείο. Αυτό είναι εντάξει, αρκεί να ταιριάζετε σε πεδία που εμφανίζονται στη γραμμή πριν από τις περιοχές της Νέας Υόρκης.

Το Join Command

Αρχικά, το πεδίο που θα ταιριάξετε πρέπει να ταξινομηθεί. Έχουμε αύξοντες αριθμούς και στα δύο αρχεία, επομένως πληρούμε αυτά τα κριτήρια. Από προεπιλογή, το join χρησιμοποιεί το πρώτο πεδίο σε ένα αρχείο, το οποίο είναι αυτό που θέλουμε. Μια άλλη λογική προεπιλογή είναι ότι η ένωση αναμένει ότι τα διαχωριστικά πεδίων θα είναι κενά. Και πάλι, το έχουμε αυτό, οπότε μπορούμε να προχωρήσουμε και να ενεργοποιήσουμε τη συμμετοχή.

Καθώς χρησιμοποιούμε όλες τις προεπιλογές, η εντολή μας είναι απλή:

join file-1.txt file-2.txt

ο

Το join θεωρεί τα αρχεία ως “αρχείο ένα” και “αρχείο δύο” σύμφωνα με τη σειρά με την οποία παρατίθενται στη γραμμή εντολών.

Η έξοδος είναι η εξής:

1 Adore Varian [email protected] Female 192.57.150.231 Varian [email protected] Female Western New York $535,304.73
2 Nancee Merrell [email protected] Female 22.198.121.181 Merrell [email protected] Female Finger Lakes $309,033.10
3 Herta Friett [email protected] Female 33.167.32.89 Friett [email protected] Female Southern Tier $461,664.44
4 Torie Venmore [email protected] Female 251.9.204.115 Venmore [email protected] Female Central New York $175,818.02
5 Deni Sealeaf [email protected] Female 210.53.81.212 Sealeaf [email protected] Female North Country $126,690.15
6 Fidel Bezley [email protected] Male 72.173.218.75 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 Standen [email protected] Female Capital District $674,634.93
8 Odell Jursch [email protected] Male 1.138.85.117 Jursch [email protected] Male Hudson Valley $663,821.09

Το αποτέλεσμα μορφοποιείται με τον ακόλουθο τρόπο: Το πεδίο στο οποίο αντιστοιχίστηκαν οι γραμμές εκτυπώνεται πρώτα, ακολουθούμενα από τα άλλα πεδία από το αρχείο ένα και μετά τα πεδία από το αρχείο δύο χωρίς το πεδίο αντιστοίχισης.

  Πώς να παρακολουθήσετε το YouTube στον επιτραπέζιο υπολογιστή Linux με το FreeTube

Μη ταξινομημένα πεδία

Ας δοκιμάσουμε κάτι που ξέρουμε ότι δεν θα λειτουργήσει. Θα βάλουμε τις γραμμές σε ένα αρχείο εκτός σειράς, έτσι ώστε το join να μην μπορεί να επεξεργαστεί σωστά το αρχείο. Τα περιεχόμενα του file-3.txt είναι τα ίδια με τα αρχεία-2.txt, αλλά η γραμμή οκτώ βρίσκεται μεταξύ των γραμμών πέντε και έξι.

Ακολουθούν τα περιεχόμενα του file-3.txt:

1 Varian [email protected] Female Western New York $535,304.73
2 Merrell [email protected] Female Finger Lakes $309,033.10
3 Friett [email protected] Female Southern Tier $461,664.44
4 Venmore [email protected] Female Central New York $175,818.02
5 Sealeaf [email protected] Female North Country $126,690.15
8 Jursch [email protected] Male Hudson Valley $663,821.09
6 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Standen [email protected] Female Capital District $674,634.93

Πληκτρολογούμε την ακόλουθη εντολή για να προσπαθήσουμε να συμμετάσχουμε στο file-3.txtto file-1.txt:

join file-1.txt file-3.txt

ο

join αναφορές ότι η έβδομη γραμμή στο file-3.txt είναι εκτός λειτουργίας, επομένως δεν υφίσταται επεξεργασία. Η γραμμή επτά είναι αυτή που ξεκινά με τον αριθμό έξι, ο οποίος θα πρέπει να είναι πριν από το οκτώ σε μια σωστά ταξινομημένη λίστα. Η έκτη γραμμή του αρχείου (η οποία ξεκινά με “8 Odell”) ήταν η τελευταία που υποβλήθηκε σε επεξεργασία, επομένως βλέπουμε την έξοδο για αυτήν.

Μπορείτε να χρησιμοποιήσετε την επιλογή –check-order εάν θέλετε να δείτε εάν η σύνδεση είναι ικανοποιημένη με τη σειρά ταξινόμησης των αρχείων—δεν θα επιχειρηθεί συγχώνευση.

Για να το κάνουμε αυτό, πληκτρολογούμε τα εξής:

join --check-order file-1.txt file-3.txt

ο

Το join σας λέει εκ των προτέρων ότι θα υπάρξει πρόβλημα με τη γραμμή έβδομη του αρχείου file-3.txt.

Αρχεία με γραμμές που λείπουν

Στο file-4.txt, η τελευταία γραμμή έχει αφαιρεθεί, επομένως δεν υπάρχει γραμμή οκτώ. Τα περιεχόμενα έχουν ως εξής:

1 Varian [email protected] Female Western New York $535,304.73
2 Merrell [email protected] Female Finger Lakes $309,033.10
3 Friett [email protected] Female Southern Tier $461,664.44
4 Venmore [email protected] Female Central New York $175,818.02
5 Sealeaf [email protected] Female North Country $126,690.15
6 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Standen [email protected] Female Capital District $674,634.93

Πληκτρολογούμε τα ακόλουθα και, παραδόξως, το join δεν παραπονιέται και επεξεργάζεται όλες τις γραμμές που μπορεί:

join file-1.txt file-4.txt

ο

Η έξοδος παραθέτει επτά συγχωνευμένες γραμμές.

Η επιλογή -a (εκτύπωση χωρίς αντιστοίχιση) λέει στο join να εκτυπωθούν επίσης οι γραμμές που δεν μπορούσαν να αντιστοιχιστούν.

Εδώ, πληκτρολογούμε την ακόλουθη εντολή για να πούμε στο join να εκτυπώσει τις γραμμές από το αρχείο ένα που δεν μπορούν να αντιστοιχιστούν με τις γραμμές στο αρχείο δύο:

join -a 1 file-1.txt file-4.txt

ο

Επτά γραμμές αντιστοιχίζονται και η γραμμή οκτώ από το αρχείο 1 εκτυπώνεται, χωρίς ταίριασμα. Δεν υπάρχουν συγχωνευμένες πληροφορίες επειδή το file-4.txt δεν περιείχε μια γραμμή οκτώ στην οποία θα μπορούσε να αντιστοιχιστεί. Ωστόσο, τουλάχιστον εξακολουθεί να εμφανίζεται στην έξοδο, ώστε να γνωρίζετε ότι δεν έχει αντιστοιχία στο file-4.txt.

Πληκτρολογούμε την ακόλουθη εντολή -v (suppress joined lines) για να αποκαλύψουμε τυχόν γραμμές που δεν έχουν αντιστοιχία:

join -v file-1.txt file-4.txt

ο

Βλέπουμε ότι η γραμμή οκτώ είναι η μόνη που δεν έχει ταίριασμα στο αρχείο δύο.

  6 καλύτερες εφαρμογές απομακρυσμένης πρόσβασης για Linux

Αντιστοίχιση άλλων πεδίων

Ας αντιστοιχίσουμε δύο νέα αρχεία σε ένα πεδίο που δεν είναι το προεπιλεγμένο (πεδίο ένα). Ακολουθούν τα περιεχόμενα του file-7.txt:

[email protected] Female 192.57.150.231
[email protected] Female 210.53.81.212
[email protected] Male 72.173.218.75
[email protected] Female 33.167.32.89
[email protected] Female 22.198.121.181
[email protected] Male 1.138.85.117
[email protected] Female 251.9.204.115
[email protected] Female 4.204.0.237

Και τα ακόλουθα είναι τα περιεχόμενα του file-8.txt:

Female [email protected] Western New York $535,304.73
Female [email protected] North Country $126,690.15
Male [email protected] Mohawk Valley $366,733.78
Female [email protected] Southern Tier $461,664.44
Female [email protected] Finger Lakes $309,033.10
Male [email protected] Hudson Valley $663,821.09
Female [email protected] Central New York $175,818.02
Female [email protected] Capital District $674,634.93

Το μόνο λογικό πεδίο που πρέπει να χρησιμοποιηθεί για τη σύνδεση είναι η διεύθυνση email, η οποία είναι το πεδίο ένα στο πρώτο αρχείο και το πεδίο δύο στο δεύτερο. Για να το αντιμετωπίσουμε, μπορούμε να χρησιμοποιήσουμε τις επιλογές -1 (αρχείο ένα πεδίο) και -2 (αρχείο δύο πεδία). Θα τα ακολουθήσουμε με έναν αριθμό που υποδεικνύει ποιο πεδίο σε κάθε αρχείο πρέπει να χρησιμοποιηθεί για σύνδεση.

Πληκτρολογούμε τα εξής για να πούμε στο join να χρησιμοποιήσει το πρώτο πεδίο στο αρχείο ένα και το δεύτερο στο αρχείο δύο:

join -1 1 -2 2 file-7.txt file-8.txt

ο

Τα αρχεία ενώνονται στη διεύθυνση email, η οποία εμφανίζεται ως το πρώτο πεδίο κάθε γραμμής στην έξοδο.

Χρήση διαφορετικών διαχωριστών πεδίων

Τι γίνεται αν έχετε αρχεία με πεδία που διαχωρίζονται με κάτι άλλο εκτός από κενά;

Τα ακόλουθα δύο αρχεία είναι οριοθετημένα με κόμμα – το μόνο κενό διάστημα είναι μεταξύ των τοπωνυμίων πολλών λέξεων:

cat file-5.txt
cat file-6.txt

Τα περιεχόμενα του

Μπορούμε να χρησιμοποιήσουμε το -t (χαρακτήρας διαχωρισμού) για να πούμε να συνδέσουμε ποιον χαρακτήρα να χρησιμοποιήσουμε ως διαχωριστικό πεδίου. Σε αυτήν την περίπτωση, είναι το κόμμα, οπότε πληκτρολογούμε την ακόλουθη εντολή:

join -t, file-5.txt file-6.txt

ο

Όλες οι γραμμές αντιστοιχίζονται και τα κενά διατηρούνται στα τοπωνύμια.

Αγνοώντας την υπόθεση επιστολών

Ένα άλλο αρχείο, το file-9.txt, είναι σχεδόν πανομοιότυπο με το file-8.txt. Η μόνη διαφορά είναι ότι ορισμένες από τις διευθύνσεις ηλεκτρονικού ταχυδρομείου έχουν κεφαλαίο γράμμα, όπως φαίνεται παρακάτω:

Female [email protected] Western New York $535,304.73
Female [email protected] North Country $126,690.15
Male [email protected] Mohawk Valley $366,733.78
Female [email protected] Southern Tier $461,664.44
Female [email protected] Finger Lakes $309,033.10
Male [email protected] Hudson Valley $663,821.09
Female [email protected]pg.org Central New York $175,818.02
Female [email protected] Capital District $674,634.93

Όταν ενώσαμε το file-7.txt και το file-8.txt, λειτούργησε τέλεια. Ας δούμε τι συμβαίνει με τα file-7.txt και file-9.txt.

Πληκτρολογούμε την παρακάτω εντολή:

join -1 1 -2 2 file-7.txt file-9.txt

ο

Ταιριάξαμε μόνο έξι γραμμές. Οι διαφορές στα κεφαλαία και πεζά γράμματα εμπόδισαν τη σύνδεση των άλλων δύο διευθύνσεων email.

Ωστόσο, μπορούμε να χρησιμοποιήσουμε την επιλογή -i (παράβλεψη πεζών-κεφαλαίων) για να αναγκάσουμε την ένωση για να αγνοήσουμε τις διαφορές και τα πεδία αντιστοίχισης που περιέχουν το ίδιο κείμενο, ανεξάρτητα από την περίπτωση.

Πληκτρολογούμε την παρακάτω εντολή:

join -1 1 -2 2 -i file-7.txt file-9.txt

ο

Και οι οκτώ γραμμές αντιστοιχίζονται και ενώνονται με επιτυχία.

Ανακατεψε και ταιριαξε

Με τη συμμετοχή, έχετε έναν ισχυρό σύμμαχο όταν παλεύετε με άβολη προετοιμασία δεδομένων. Ίσως πρέπει να αναλύσετε τα δεδομένα ή ίσως προσπαθείτε να τα κάνετε μασάζ για να πραγματοποιήσετε εισαγωγή σε διαφορετικό σύστημα.

Όποια και αν είναι η κατάσταση, θα χαρείτε να συμμετάσχετε στη γωνιά σας!