Περισσότερα
Ταξινόμηση με βάση την τρίτη στήλη
Αντιμετωπίζω ένα τεράστιο αρχείο 4 στηλών. Θα ήθελα να εμφανίσω το ταξινομημένο αρχείο στο stdout με βάση την 3η στήλη του:
cat myFile | sort -u -k3
Είναι αυτό αρκετό για να εκτελέσω το τέχνασμα;
137
3
θα εμφανίσει το αρχείο ταξινομημένο με βάση τη στήλη 3rd υποθέτοντας ότι οι στήλες χωρίζονται με ακολουθίες κενών (χαρακτήρες ASCII SPC και TAB στην τοπική γλώσσα POSIX/C), σύμφωνα με τη σειρά ταξινόμησης που ορίζεται από την τρέχουσα τοπική γλώσσα.
Σημειώστε ότι τα κενά που προηγούνται συμπεριλαμβάνονται στη στήλη (το προεπιλεγμένο διαχωριστικό είναι η μετάβαση από ένα μη κενό σε ένα κενό), αυτό μπορεί να κάνει τη διαφορά σε τοπικά περιβάλλοντα όπου τα κενά δεν αγνοούνται για τους σκοπούς της σύγκρισης, χρησιμοποιήστε την επιλογή
-b
για να αγνοήσετε τα κενά που προηγούνται.Σημειώστε ότι είναι εντελώς ανεξάρτητο από το κέλυφος (όλα τα κελύφη θα αναλύσουν αυτή τη γραμμή εντολών με τον ίδιο τρόπο, τα κελύφη γενικά δεν έχουν ενσωματωμένη την εντολή
sort
).-k 3
είναι να ταξινομήσει το τμήμα των γραμμών που αρχίζει με τη στήλη 3rd (συμπεριλαμβανομένων των κενών στην αρχή). Στην τοπική γλώσσα C, επειδή οι χαρακτήρες space και tab κατατάσσονται πριν από όλους τους εκτυπώσιμους χαρακτήρες, αυτό θα σας δώσει γενικά το ίδιο αποτέλεσμα με το-k 3,3
(εκτός από γραμμές που έχουν ένα πανομοιότυπο τρίτο πεδίο),-u
είναι να διατηρήσετε μόνο μία από τις γραμμές, αν υπάρχουν πολλές που ταξινομούνται πανομοιότυπα (δηλαδή όταν το κλειδί ταξινόμησης ταξινομεί το ίδιο (αυτό'δεν είναι απαραίτητα το ίδιο με το είναι ίσο)).Η
cat
είναι η εντολή για την concatenate. Δεν τη χρειάζεστε εδώ.Αν οι στήλες διαχωρίζονται με κάτι άλλο, χρειάζεστε την επιλογή
-t
για να καθορίσετε το διαχωριστικό.Δίνεται το παράδειγμα του αρχείου
a
Με
-u -k 3
:Οι γραμμές 2 και 3 έχουν την ίδια τρίτη στήλη, αλλά εδώ το κλειδί ταξινόμησης είναι από την τρίτη στήλη μέχρι το τέλος της γραμμής, οπότε το
-u
διατηρεί και τις δύο. Το␠ca␠d
ταξινομεί πριν από το␠c␠c
επειδή τα κενά αγνοούνται στο πρώτο πέρασμα στην τοπική μου γλώσσα, τοcad
ταξινομεί πριν από τοcc
.Παραπάνω διατηρείται μόνο μία για εκείνες όπου η 3η στήλη είναι
␠c
. Προσέξτε πώς διατηρείται αυτή με το␠␠c
(2 κενά στην αρχή).Δείτε πώς η σειρά των
a b c d
καιa c c c c c
αντιστρέφεται. Στην πρώτη περίπτωση, επειδή το␠c␠c
ταξινομεί πριν από το␠c␠d
, στη δεύτερη περίπτωση επειδή το κλειδί ταξινόμησης είναι το ίδιο (␠c
), η σύγκριση τελευταίου καταφυγίου που συγκρίνει τις γραμμές στο σύνολό τους βάζει τοa b c d
πριν από τοa c c c
.Μόλις αγνοήσουμε τα κενά, το κλειδί ταξινόμησης για τις 3 πρώτες γραμμές είναι το ίδιο (
c
), οπότε ταξινομούνται με τη σύγκριση τελευταίας καταφυγής.Στην τοπική γλώσσα C, το
␠␠c
ταξινομείται πριν από το␠c
καθώς υπάρχει μόνο ένα πέρασμα εκεί όπου οι χαρακτήρες (στη συνέχεια μεμονωμένα bytes) ταξινομούνται με βάση την τιμή του σημείου κωδικού τους (όπου το κενό έχει χαμηλότερο σημείο κωδικού από τοc
).Αν καταλαβαίνετε το "column" ως αρχείο κειμένου (4ος χαρακτήρας), τότε ναι, η λύση σας θα πρέπει να λειτουργήσει (ή ακόμα και το
sort -u -k3 myFile
για να επιτρέψετε στοsort
να κάνει κάποια μαγικά για εξοικονόμηση μνήμης με τυχαία πρόσβαση). Αν καταλαβαίνετε το "column" όπως στη βάση δεδομένων - μια ολόκληρη οντότητα δεδομένων που ακολουθείται από ένα διαχωριστικό, και μεταβλητό πλάτος στήλης, θα χρειαστείτε κάτι πιο φανταχτερό, π.χ. αυτό ταξινομεί το ls -l κατά μέγεθος(το οποίο είναι ισοδύναμο με το τετριμμένο
ls -lS
αλλά εξυπηρετεί το παράδειγμα όμορφα).είναι η σωστή εντολή για την ταξινόμηση οποιασδήποτε λίστας που έχει αριθμητικούς χαρακτήρες χρησιμοποιώντας συγκεκριμένη στήλη