Ordina in base alla terza colonna
Mi trovo di fronte ad un enorme file a 4 colonne. Vorrei visualizzare il file ordinato in stdout in base alla sua terza colonna:
cat myFile | sort -u -k3
È sufficiente per eseguire il trucco?
137
3
visualizzerebbe il file ordinato per la colonna 3rd assumendo che le colonne siano separate da sequenze di spazi vuoti (caratteri ASCII SPC e TAB nel locale POSIX/C), secondo l'ordine di ordinamento definito dal locale corrente.
Si noti che gli spazi vuoti iniziali sono inclusi nella colonna (il separatore predefinito è la transizione da uno spazio non vuoto a uno spazio vuoto), questo può fare la differenza nei locali in cui gli spazi non sono ignorati ai fini del confronto, usare l'opzione
-b
per ignorare gli spazi vuoti iniziali.Si noti che è completamente indipendente dalla shell (tutte le shell analizzerebbero quella linea di comando allo stesso modo, le shell generalmente non hanno il comando
sort
integrato).-k 3
è per ordinare sulla porzione di linee che iniziano con la colonna 3rd (inclusi gli spazi vuoti iniziali). Nel locale C, poiché i caratteri di spazio e di tabulazione precedono tutti i caratteri stampabili, questo vi darà generalmente lo stesso risultato di-k 3,3
(tranne per le linee che hanno un terzo campo identico),-u
serve a mantenere solo una delle linee se ce ne sono diverse che ordinano in modo identico (cioè quando la chiave di ordinamento ordina allo stesso modo (che non è necessariamente lo stesso che essere uguale)).cat
è il comando per concatenare. Non ne hai bisogno qui.Se le colonne sono separate da qualcos'altro, hai bisogno dell'opzione
-t
per specificare il separatore.Dato il file di esempio
a
Con
-u -k 3
:Le linee 2 e 3 hanno la stessa terza colonna, ma qui la chiave di ordinamento è dalla terza colonna alla fine della linea, quindi
-u
le conserva entrambe.␠ca␠d
ordina prima di␠c␠c
perché gli spazi sono ignorati nel primo passaggio nel mio locale,cad
ordina prima dicc
.Qui sopra ne viene mantenuto solo uno per quelli in cui la terza colonna è
␠c
. Nota come quello con␠␠c
(2 spazi iniziali) viene mantenuto.Guarda come l'ordine di
a b c d
ea c c
sono invertiti. Nel primo caso, poiché␠c␠c
ordina prima di␠c␠d
, nel secondo caso poiché la chiave di ordinamento è la stessa (␠c
), il confronto di ultima istanza che confronta le linee per intero mettea b c d
prima di `a c c``.Una volta ignorati gli spazi vuoti, la chiave di ordinamento per le prime 3 linee è la stessa (
c
), quindi sono ordinate dal confronto di ultima istanza.Nel locale C,
␠␠c
ordina prima di␠c
perché c'è solo un passaggio in cui i caratteri (quindi i singoli byte) vengono ordinati in base al loro valore di punto di codice (dove lo spazio ha un punto di codice più basso dic
).Se intendi "colonna" come file di testo (4° carattere) allora sì, la tua soluzione dovrebbe funzionare (o anche
sort -u -k3 myFile
per permettere asort
di eseguire alcune magie di risparmio di memoria con accesso casuale). Se intendi "colonna" come database - un'intera entità di dati seguita da un separatore, e larghezza di colonna variabile, avrai bisogno di qualcosa di più sofisticato, ad esempio questo ordina ls -l per dimensione(che è equivalente al banale
ls -lS
ma serve bene all'esempio).è il comando giusto per ordinare qualsiasi lista con caratteri numerici usando una colonna specifica