Ordina in base alla terza colonna


132

Sto affrontando un enorme file a 4 colonne. Vorrei visualizzare il file ordinato in stdout in base alla sua terza colonna:

cat myFile | sort -u -k3

È abbastanza per eseguire il trucco?


4
Nota che puoi scrivere questo come sort -u -k3 < myFile.
Gerrit,

6
Come sort -u -k3 myFile, anche
Sebastian Graf,

Risposte:


168
sort -k 3,3 myFile

visualizzerebbe il file ordinato in base alla terza colonna supponendo che le colonne siano separate da sequenze di spazi vuoti (caratteri ASCC SPC e TAB nella locale POSIX / C), in base all'ordinamento definito dalla locale corrente.

Si noti che gli spazi vuoti iniziali sono inclusi nella colonna (il separatore predefinito è la transizione da uno non vuoto a uno vuoto), che può fare la differenza in locali in cui gli spazi non vengono ignorati a scopo di confronto, utilizzare l' -bopzione per ignorare gli spazi vuoti principali.

Si noti che è completamente indipendente dalla shell (tutte le shell analizzerebbero la stessa riga di comando, generalmente le shell non hanno il sortcomando incorporato).

-k 3consiste nell'ordinare sulla parte delle linee che iniziano con la terza colonna (compresi gli spazi vuoti iniziali ). Nella locale C, poiché i caratteri di spazio e di tabulazione si posizionano prima di tutti i caratteri stampabili, ciò fornirà generalmente lo stesso risultato di -k 3,3(tranne per le linee che hanno un terzo campo identico),

-uconsiste nel mantenere solo una delle righe se ce ne sono diverse che si ordinano in modo identico (è qui che la chiave di ordinamento ordina la stessa (che non è necessariamente la stessa di uguale )).

catè il comando per con cat enate. Non ne hai bisogno qui.

Se le colonne sono separate da qualcos'altro, è necessario l' -topzione per specificare il separatore.

File di esempio fornito 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 righe 2 e 3 hanno la stessa terza colonna, ma qui la chiave di ordinamento va dalla terza colonna alla fine della riga, quindi -umantiene entrambe. ␠ca␠dordina prima ␠c␠cperché gli spazi vengono ignorati nel primo passaggio nella mia locale, cadordina prima cc.

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

Sopra solo uno è conservato per quelli in cui si trova la terza colonna ␠c. Nota come ␠␠cviene conservato quello con (2 spazi iniziali).

$ 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 de a c c csono invertiti. Nel primo caso, perché ␠c␠cordina prima ␠c␠d, nel secondo caso perché la chiave di ordinamento è la stessa ( ␠c), il confronto dell'ultima risorsa che confronta le righe in full mette a b c dprima 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

Una volta ignorati gli spazi vuoti, la chiave di ordinamento per le prime 3 righe è la stessa ( c), quindi vengono ordinate in base al confronto dell'ultima risorsa.

$ 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

Nella locale C, ␠␠cordina prima in ␠cquanto vi è un solo passaggio lì dove i caratteri (quindi i singoli byte) si ordinano in base al loro valore del punto di codice (dove lo spazio ha un punto di codice inferiore rispetto a c).


le colonne sono blankseparate che possono includere altri caratteri oltre allo spazio e alla scheda a seconda delle impostazioni locali.
jfs,

1
Bello, +1. Potresti spiegare cosa 3,3fa? Perché non solo 3?
terdon

@terdon, vedi descrizione estesa con esempi.
Stéphane Chazelas,

@JFSebastian, hai ragione, risposta aggiornata.
Stéphane Chazelas,

Ah, per farcela solo il 3, non il resto della linea, grazie.
Terdon

4

Se capisci "colonna" come nel file di testo (4 ° carattere), allora sì, la tua soluzione dovrebbe funzionare (o anche sort -u -k3 myFileper consentire l' sortesecuzione di alcune magie per il salvataggio della memoria con accesso casuale). Se capisci "colonna" come nel database - un'intera entità di dati seguita da un separatore e larghezza della colonna variabile, avrai bisogno di qualcosa di più elaborato, ad esempio questo tipo ls -l per dimensione

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

(che equivale a banale ls -lSma serve bene l'esempio.)


5
No, per ordinamento predefinito colonne sono vuote separate, non sono colonne di caratteri, per ordinare la colonna 3 ° carattere, la sintassi sarebbe: sort -k 1.3,1.3. ls -l | sort -k5,5nper ordinare in base alla dimensione.
Stéphane Chazelas,

La awksoluzione è esattamente ciò di cui avevo bisogno, facilmente modificabile per adattarsi a requisiti di ordinamento complessi
jchook,

2
sort -g -k column_number 

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


1
L'uso di -k è già stato trattato abbastanza bene, quindi sarebbe utile se spiegassi come questo comando sia diverso o migliore. Forse potresti anche includere numeri di colonna effettivi per rispondere alla domanda effettiva del PO.
Jeff Schaller

Questo mi ha permesso di usare le pagine man: p "-g, --general-numeric-sort, compare in base al valore numerico generale" che era ciò di cui avevo bisogno nel mio caso.
unisce il


0
$ sort -k 1.3,1.3 myfile

Ordinerà il tuo file myfile sulla terza colonna se il tuo file non ha alcun separatore.

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

pagina man di ordinamento:

[...] -k, --key = POS1 [, POS2] avvia una chiave su POS1 (origine 1), termina su POS2 (fine riga predefinita) [...] POS è F [.C] [ OPTS], dove F è il numero del campo e C la posizione del carattere nel campo; entrambi sono di origine 1. Se né -t né -b sono attivi, i caratteri in un campo vengono conteggiati dall'inizio dello spazio bianco precedente. OPTS è una o più opzioni di ordinamento a lettera singola, che sostituiscono le opzioni di ordinamento globali per quella chiave. Se non viene fornita alcuna chiave, utilizzare l'intera riga come chiave.

Con --key = 1.3,1.3, hai detto che esiste un solo campo (l'intera riga) e che stai confrontando la posizione del terzo carattere di questo campo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.