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?
sort -u -k3 myFile, anche
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?
sort -u -k3 myFile, anche
Risposte:
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).
blankseparate che possono includere altri caratteri oltre allo spazio e alla scheda a seconda delle impostazioni locali.
3,3fa? Perché non solo 3?
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.)
sort -k 1.3,1.3. ls -l | sort -k5,5nper ordinare in base alla dimensione.
awksoluzione è esattamente ciò di cui avevo bisogno, facilmente modificabile per adattarsi a requisiti di ordinamento complessi
sort -g -k column_number
è il comando giusto per ordinare qualsiasi elenco con caratteri numerici usando una colonna specifica
$ 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.
sort -u -k3 < myFile.