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' -b
opzione 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 sort
comando incorporato).
-k 3
consiste 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),
-u
consiste 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' -t
opzione 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 -u
mantiene entrambe. ␠ca␠d
ordina prima ␠c␠c
perché gli spazi vengono ignorati nel primo passaggio nella mia locale, cad
ordina 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 ␠␠c
viene 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 d
e a c c c
sono invertiti. Nel primo caso, perché ␠c␠c
ordina 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 d
prima 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, ␠␠c
ordina prima in ␠c
quanto 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
).
blank
separate che possono includere altri caratteri oltre allo spazio e alla scheda a seconda delle impostazioni locali.
3,3
fa? 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 myFile
per consentire l' sort
esecuzione 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 -lS
ma serve bene l'esempio.)
sort -k 1.3,1.3
. ls -l | sort -k5,5n
per ordinare in base alla dimensione.
awk
soluzione è 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
.