Ταξινόμηση με βάση την τρίτη στήλη

Αντιμετωπίζω ένα τεράστιο αρχείο 4 στηλών. Θα ήθελα να εμφανίσω το ταξινομημένο αρχείο στο stdout με βάση την 3η στήλη του:

cat myFile | sort -u -k3

Είναι αυτό αρκετό για να εκτελέσω το τέχνασμα;

Λύση
sort -k 3,3 myFile

θα εμφανίσει το αρχείο ταξινομημένο με βάση τη στήλη 3rd υποθέτοντας ότι οι στήλες χωρίζονται με ακολουθίες κενών (χαρακτήρες ASCII SPC και TAB στην τοπική γλώσσα POSIX/C), σύμφωνα με τη σειρά ταξινόμησης που ορίζεται από την τρέχουσα τοπική γλώσσα.

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

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

-k 3 είναι να ταξινομήσει το τμήμα των γραμμών που αρχίζει με τη στήλη 3rd (συμπεριλαμβανομένων των κενών στην αρχή). Στην τοπική γλώσσα C, επειδή οι χαρακτήρες space και tab κατατάσσονται πριν από όλους τους εκτυπώσιμους χαρακτήρες, αυτό θα σας δώσει γενικά το ίδιο αποτέλεσμα με το -k 3,3 (εκτός από γραμμές που έχουν ένα πανομοιότυπο τρίτο πεδίο),

-u είναι να διατηρήσετε μόνο μία από τις γραμμές, αν υπάρχουν πολλές που ταξινομούνται πανομοιότυπα (δηλαδή όταν το κλειδί ταξινόμησης ταξινομεί το ίδιο (αυτό'δεν είναι απαραίτητα το ίδιο με το είναι ίσο)).

Η cat είναι η εντολή για την concatenate. Δεν τη χρειάζεστε εδώ.

Αν οι στήλες διαχωρίζονται με κάτι άλλο, χρειάζεστε την επιλογή -t για να καθορίσετε το διαχωριστικό.

Δίνεται το παράδειγμα του αρχείου a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

Με -u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

Οι γραμμές 2 και 3 έχουν την ίδια τρίτη στήλη, αλλά εδώ το κλειδί ταξινόμησης είναι από την τρίτη στήλη μέχρι το τέλος της γραμμής, οπότε το -u διατηρεί και τις δύο. Το ␠ca␠d ταξινομεί πριν από το ␠c␠c επειδή τα κενά αγνοούνται στο πρώτο πέρασμα στην τοπική μου γλώσσα, το cad ταξινομεί πριν από το cc.

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

Παραπάνω διατηρείται μόνο μία για εκείνες όπου η 3η στήλη είναι ␠c. Προσέξτε πώς διατηρείται αυτή με το ␠␠c (2 κενά στην αρχή).

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

Δείτε πώς η σειρά των a b c d και a c c c c c αντιστρέφεται. Στην πρώτη περίπτωση, επειδή το ␠c␠c ταξινομεί πριν από το ␠c␠d, στη δεύτερη περίπτωση επειδή το κλειδί ταξινόμησης είναι το ίδιο (␠c), η σύγκριση τελευταίου καταφυγίου που συγκρίνει τις γραμμές στο σύνολό τους βάζει το a b c d πριν από το a c c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

Μόλις αγνοήσουμε τα κενά, το κλειδί ταξινόμησης για τις 3 πρώτες γραμμές είναι το ίδιο (c), οπότε ταξινομούνται με τη σύγκριση τελευταίας καταφυγής.

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

Στην τοπική γλώσσα C, το ␠␠c ταξινομείται πριν από το ␠c καθώς υπάρχει μόνο ένα πέρασμα εκεί όπου οι χαρακτήρες (στη συνέχεια μεμονωμένα bytes) ταξινομούνται με βάση την τιμή του σημείου κωδικού τους (όπου το κενό έχει χαμηλότερο σημείο κωδικού από το c).

Σχόλια (7)

Αν καταλαβαίνετε το "column" ως αρχείο κειμένου (4ος χαρακτήρας), τότε ναι, η λύση σας θα πρέπει να λειτουργήσει (ή ακόμα και το sort -u -k3 myFile για να επιτρέψετε στο sort να κάνει κάποια μαγικά για εξοικονόμηση μνήμης με τυχαία πρόσβαση). Αν καταλαβαίνετε το "column" όπως στη βάση δεδομένων - μια ολόκληρη οντότητα δεδομένων που ακολουθείται από ένα διαχωριστικό, και μεταβλητό πλάτος στήλης, θα χρειαστείτε κάτι πιο φανταχτερό, π.χ. αυτό ταξινομεί το ls -l κατά μέγεθος

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(το οποίο είναι ισοδύναμο με το τετριμμένο ls -lS αλλά εξυπηρετεί το παράδειγμα όμορφα).

Σχόλια (2)
sort -g -k column_number 

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

Σχόλια (2)