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?

Soluzione
sort -k 3,3 myFile

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

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

Con -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

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 di cc.

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

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.

$ 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

Guarda come l'ordine di a b c d e a 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 mette a b c d prima di `a c c``.

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

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.

$ 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

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 di c).

Commentari (7)

Se intendi "colonna" come file di testo (4° carattere) allora sì, la tua soluzione dovrebbe funzionare (o anche sort -u -k3 myFile per permettere a sort 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

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

(che è equivalente al banale ls -lS ma serve bene all'esempio).

Commentari (2)
sort -g -k column_number 

è il comando giusto per ordinare qualsiasi lista con caratteri numerici usando una colonna specifica

Commentari (2)