Comandi Linux

Comando di ordinamento Bash

Comando di ordinamento Bash
Buona fortuna nel tentativo di implementare un algoritmo di ordinamento in bash che finisca prima di domani. Nessun problema, non è necessario perché hai il comando sort.

Con sort, puoi ordinare i file in base all'ordine nel dizionario o per valore numerico, randomizzare le righe dei file, rimuovere le righe duplicate e controllare se un file è ordinato.

Potresti essere in grado di fare altre cose con esso, ma prima, preoccupiamoci di avvolgere le nostre teste su come usare sort negli script bash.

Cos'è il tipo??

Sort è un comando esterno che concatena i file mentre ordina il loro contenuto in base a un tipo di ordinamento e scrive i risultati di ordinamento nell'output standard.

Ordina le opzioni del comando per bash

Il comando sort include 31 opzioni (13 principali e 18 classificate come altro). La programmazione bash più esperta (anche gli esperti) conosce solo alcune opzioni di ordinamento principali necessarie per cavarsela. Gli altri sono raramente toccati. Per tua fortuna abbiamo tempo per toccarli tutti.

Principali opzioni di ordinamento

Queste sono le opzioni che ti aiutano a fare le cose e a ordinare (Ordinamento) oltre a manipolare i risultati ordinati (Post-elaborazione) e ad applicare filtri (Filtri) prima dell'ordinamento.

Ordinamento

L'ordinamento viene fornito con 5 diversi tipi di ordinamento. Ecco una tabella che mostra ogni tipo di ordinamento con le opzioni associate.

Ordinare Opzione corta/opzione lunga/ecc
parola
Ordinamento numerico (generale) -g / -ordinamento-numerico-generale
numerico-generale
supporto per la notazione scientifica
0.1234e4 = 1234
Ordinamento numerico (umano) -h / -ordinamento-numerico-umano
umano-numerico
1.234K = 1234
Numerico -n / -ordinamento-numerico
numerico
… < -1 < 0 < 1 <…
Mese -M / -mese-sort
mese
Sconosciuto < Jan < Feb <… < Nov < Dec
Casuale -r / -ordinamento-casuale
casuale
Versione -V / -version-sort
versione

Nota che ogni tipo di ordinamento ha un'opzione lunga che termina con -sort. Oltre alle opzioni di ordinamento specifiche, è possibile utilizzare l'opzione -sort=WORD per ordinare per parola. Ad esempio -sort=random può essere usato al posto di -random-sort o -r.

Esempi

Ecco alcuni esempi di comandi di ordinamento per ciascun metodo di ordinamento.

Esempio) Ordinamento dei nomi

L'ordinamento non ha problemi a ordinare le righe in ordine alfabetico. Considera un elenco di personaggi famosi non ordinato.

Funzione

gente famosa()

curl --silent https://www.biografia in linea.rete/persone/famoso-100.html
| grep post-content | sed -e 's/<[^>]*.//g' -e 's/WWII//g' -e 's/\(Wilbur\)
/\1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'

Riga di comando

personaggi famosi | ordinare

Produzione

Stephen King (1947 - )
Steve Jobs (1955 - 2012)
Sting (1951 - )
Tiger Woods (1975 - )
Tom Cruise (1962 - )
Usain Bolt (1986 - )
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)

Esempio) Ordinamento numerico generale

Se abbiamo bisogno di ordinare i valori numerici prendendo in considerazione la notazione scientifica come 99e2, possiamo usare l'ordinamento numerico generale.

Funzione

valori-numerici-non ordinati ()

seq 100 | sort --ordinamento-casuale | sed '3i 9e2' | sed '3i 99K'

Considera l'output ordinato utilizzando ciascun metodo. Nota che oltre a contenere i valori da 1 a 100, l'elenco include anche '9e12' (900) e '99K' (99000).

Riga di comando

valori-numerici-non ordinati | sort -n

Produzione

96
97
98
99
99K
100

Che dire di 900 e 99000. Esatto, è solo un ordinamento numerico. Il prossimo.

Riga di comando

valori-numerici-non ordinati | sort -h

Produzione

96
97
98
99
100
99K

Che ne dici di 900. Esatto, è solo un ordinamento numerico umano. Il prossimo.

Riga di comando

valori-numerici-non ordinati | sort -g

Produzione

96
97
98
99
99K
100
9e2

Che ne dici di 99000. Esatto, è solo un ordinamento numerico generale. Come vedi nessun metodo di ordinamento è compatibile in questo caso; tuttavia, ciò non significa che non puoi trovare una soluzione.

Riga di comando

valori-numerici-non ordinati | sed 's/[kK]/e3/' | sort -g

Produzione

96
97
98
99
100
9e2
99e3

Ora è più così.

Esempio) Ordinamento numerico umano

Se abbiamo bisogno di ordinare i valori numerici prendendo in considerazione il significato di notazioni come K, G, M ed E, possiamo usare l'ordinamento numerico umano.

Riga di comando

seq 100 | sort --ordinamento-casuale | sed '3i 3k' | sort -h

Produzione

96
97
98
99
100
3k

Esempio) Ordinamento numerico

Se tutto ciò di cui abbiamo bisogno è ordinare i numeri interi, l'ordinamento numerico fa il trucco.

Riga di comando

seq 100 | sort --ordinamento-casuale | sort --numerics-sort

Produzione

95
96
97
98
99
100

Esempio) Ordinamento per mese

L'ordinamento per mese ti consente di ordinare le righe per mese. Potrebbe rivelarsi utile per raggruppare le righe per mese soprattutto nel caso in cui non sia disponibile l'opzione di ordinamento per orario.

Funzione

mesi ()

gatto  <Jan
febbraio
Mar
aprile
Maggio
giugno
luglio
agosto
settembre
ottobre
novembre
dicembre
EOF

Supponiamo che i mesi non siano ordinati.

Riga di comando

mesi | sort --ordinamento-casuale

Produzione

Mar
ottobre
dicembre
aprile
Maggio
settembre
agosto
novembre
luglio
Jan
febbraio
giugno

Possiamo sempre ordinare per mese.

Riga di comando

mesi | sort --ordinamento-casuale | sort --month-sort

Produzione

Jan
febbraio
Mar
aprile
Maggio
giugno
luglio
agosto
settembre
ottobre
novembre
dicembre

Nota che se cambiamo Dec in qualsiasi sottostringa a novembre diciamo 'Novem', apparirà dopo 'Nov' nell'output ordinato.

Esempio) Ordinamento casuale: uccidi il terminale di qualcun altro

Come previsto, l'ordinamento casuale fa l'opposto dell'ordinamento, confonde le righe.

Supponiamo che per scopi educativi vogliamo uccidere un altro utente. Dovremmo assicurarci che non sia il nostro pty e randomizzare gli elenchi in modo che sia più bello e che possiamo dire che i pty sono stati selezionati a caso.

Comandi

messaggio-pty ()


pty locale;
pty="$1"
;
echo -n "Stai andando giù" > /dev/$pty;
per i in 5 4 3 2 1;
fare
dormire 1;
echo -n " ​​$i" > /dev/$pty;
fatto;
eco " Ciao By!" > /dev/$pty;
dormire 1


ps | grep pty | grep -v -e $( mypty ) | sort --ordinamento-casuale | head -1 > stdin;

messaggio-pty $( pty < stdin );
kill $( pid pi < stdin )


Uscita nel terminale di qualcun altro
Stai andando giù tra 5 4 3 2 1 Ciao!]
(Uscita)

Esempio) Ordinamento versione - ordinamento ips

Come sai, i file sorgente possono essere versionati usando stringhe come 1.0. Inoltre, le versioni possono andare più in profondità con numeri di versione come 1.0.0 come si vede nei popolari schemi di versione semantica.

L'ordinamento delle versioni ti consente di ordinare i numeri di versione. grande! ora cosa?? Mettiamolo alla prova.

Per questo esempio, ho preparato uno script bash per generare ips casuali in modo da non dover andare lì. È nel repo. Per quelli di noi che non hanno il repository, ecco un inizio veloce.

Comandi

git clone https://github.com/temptemp3/linuxhint.come.idiota
alias random-ips='test -f "linuxhint.com/genera-ips-casuali.sh" ; bash $_'

Ora che sei pronto iniziamo.

Riga di comando

ips casuali 200 | t-shirt

Produzione

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111

Ok, funziona. Ora vediamo cosa succede quando proviamo a ordinare ips.

Riga di comando

ordina ips

Produzione

76.88.194.157
8.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186

A prima vista, sembra funzionare ma linee come 8.96.11.181 dovrebbe apparire altrove.

Comandi


per o in d h n V g M
fare
sort ips -$o > ips$o,,
fatto

echo tutti gli ordinamenti uguale ordinamento numerico
diff ipsn,d 1>/dev/null || eco dizionario ordine != ordinamento numerico
diff ipsn,h 1>/dev/null || echo ordinamento numerico umano != ordinamento numerico
diff ipsn,g 1>/dev/null || echo ordinamento numerico generale != ordinamento numerico
diff ipsn,v 1>/dev/null ||
echo version sort != ordinamento numerico
show_n_v_ips_diff="true"


test ! "$show_n_v_ips_diff" || diff ipsn,v

Produzione

tutti gli ordinamenti uguale ordinamento numerico
ordine del dizionario != ordinamento numerico
ordinamento versione != ordinamento numerico
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40

Come vedi l'ordinamento delle versioni ti consente di ordinare i numeri di versione quando altri metodi di ordinamento falliscono.

Esempio) Ordinamento versione - ordinamento dei nomi dei file con i numeri di versione

Partendo dall'ultimo esempio, usiamo version sort un po' più vicino all'uso previsto. Come sai, i numeri di versione appaiono comunemente nei nomi dei file. Vedi i dettagli sull'ordinamento delle versioni.

Per prima cosa, trasformiamo ips in qualcos'altro di più file sorgente del progetto come.

Comandi

alfa()
alpha="abcdefghijklmnopqrstuvwxyz";
echo -n $alpha:$(( RANDOM % 26 )):1

beta()
alfa="ab";
echo -n $alpha:$(( RANDOM % 2 )):1


gatto ips | while read -r riga; fare
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || beta).catrame.gz;
fatto | sorsi di tee

Produzione

x-v56.16.109.54.catrame.gz
k-v117.38.14.165a.catrame.gz
d-v87.59.32.91a.catrame.gz
h-v115.215.64.100.catrame.gz
s-v72.174.246.218b.catrame.gz
h-v163.93.19.173.catrame.gz
u-v184.225.11.92b.catrame.gz
y-v205.53.5.211a.catrame.gz
t-v175.196.164.17b.catrame.gz
e-v167.42.221.178b.catrame.gz
c-v126.54.190.189b.catrame.gz
b-v169.180.221.131a.catrame.gz
y-v210.125.170.231a.catrame.gz
x-v71.56.120.9b.catrame.gz

Esercizio

Rendi più veloci i comandi precedenti usando xargs

Vedi esempio in come usare il comando xargs negli script bash.

Questa volta, non ci preoccuperemo nemmeno di usare nessuno degli altri metodi di ordinamento.

Riga di comando

sort -V sorsi

Produzione

d-v127.100.108.192.catrame.gz
e-v62.140.229.42a.catrame.gz
e-v149.77.211.215a.catrame.gz
e-v167.42.221.178b.catrame.gz
e-v194.189.236.29a.catrame.gz
e-v198.145.199.84b.catrame.gz
e-v240.1.147.196b.catrame.gz
f-v50.100.142.42b.catrame.gz
f-v117.58.230.116.catrame.gz
f-v139.17.210.68b.catrame.gz
f-v153.18.145.133b.catrame.gz
g-v201.153.203.60b.catrame.gz
g-v213.58.67.108.catrame.gz
h-v5.206.37.224.catrame.gz

Ora vedi che l'ordinamento della versione può essere utile quando si ordinano i nomi dei file con i numeri di versione.

Pre ordinamento

L'ordinamento ha quattro opzioni principali che influiscono sull'ordinamento effettivo, vale a dire -ignore-leading-blanks, -ignore-case, -ignore-nonprinting e -dictionary-order, che possono o meno sovrapporsi. Esempio di utilizzo di ciascuna opzione segue.

Ordina ignorando gli spazi iniziali

Ordina consente di ignorare gli spazi iniziali di input come opzione. Gli spazi iniziali vengono conservati nell'output ordinato.

Opzione

--ignora-spazi vuoti

Utilizzo

sort --ignora gli spazi vuoti iniziali

Comandi

personaggi famosi > fp
gatto >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abramo Lincoln (1809 - 1865)
EOF
gatto fp | ordina | tac

Produzione

Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abramo Lincoln (1809 - 1865)

Nota che gli spazi iniziali nelle righe aggiunte a fp appaiono per primi nell'output di ordinamento.

Per risolvere questo problema dobbiamo ignorare gli spazi vuoti iniziali come segue.

Comandi

personaggi famosi > fp
gatto >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abramo Lincoln (1809 - 1865)
EOF
gatto fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac

Produzione

Marilyn Monroe (1926 - 1962)
Marilyn Monroe (1926 - 1962)
Maria Antonietta (1755 - 1793)

Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Abramo Lincoln (1809 - 1865)

alternative

gatto fp | sed 's/^\s*//' | ordina | tac

Nota che l'alternativa non conserva gli spazi iniziali nell'ordinamento dell'output.

Ordina ignorando il caso

Ordina consente di ignorare il caso di input come opzione. Il caso è conservato nell'output ordinato.

Opzione

--ignora-caso

Utilizzo

sort --ignore-case

Comandi

personaggi famosi > fp
gatto >> fp << EOF
abramo Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
gatto fp | ordina | tac

Produzione

Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Nota che gli spazi iniziali nelle righe aggiunte a fp appaiono per primi nell'output di ordinamento.

Per risolvere questo problema dobbiamo ignorare gli spazi vuoti iniziali come segue.

Comandi

personaggi famosi > fp
gatto >> fp << EOF
abramo Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
gatto fp | sort --ignore-case | tac

Produzione

Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
abramo Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

alternative

gatto fp | while read -r riga ; do echo $linea,, ; fatto | ordina | tac

Nota che l'alternativa non conserva maiuscole e minuscole nell'output di ordinamento.

Ordina ignorando non stampabile

Ordina consente di ignorare l'input non stampabile come opzione. La non stampa viene conservata nell'output ordinato.

Opzione

--ignora-non stampabile

Utilizzo

sort --ignore-non stampabile

Comandi

personaggi famosi > fp
echo -e "\x90Abe" >> fp
gatto fp | ordina | tac

Produzione

Audrey Hepburn (1929 - 1993)
Angelina Jolie (1975 - )
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)

Sembra che ci manchi un "Abe" per i caratteri non stampabili nell'input di ordinamento.

Per risolvere questo problema dobbiamo ignorare i caratteri non stampabili.

Comandi

personaggi famosi > fp
echo -e "\x90Abe" >> fp
gatto fp | sort --ignore-non stampabile | tac
[/cc\
Produzione
[cc lang="bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Abe

Ordina l'ordine del dizionario

Ordina consente di ignorare tutti gli input tranne gli spazi e i caratteri alfanumerici come opzione. L'input è conservato nell'output ordinato.

personaggi famosi > fp
echo -e "\x90Abe" >> fp
gatto fp | sort --d | tac

Ordina post

L'ordinamento ha un'opzione principale che non influisce sull'ordinamento, ovvero -reverse. Tuttavia, influisce sull'output, consentendo di alternare l'ordine tra ascendente e discendente. Segue un esempio.

Ordina output inverso

Ordina consente di visualizzare l'output in ordine inverso come opzione.

Opzione

--inversione

Utilizzo

ordina --reverse

Riga di comando

personaggi famosi | ordina --reverse

Produzione

Angelina Jolie (1975 - )
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)

alternative

ordina | tac

Altre opzioni per l'ordinamento

Ci sono altre ventidue opzioni per l'ordinamento. Seguono esempi.

Ordina controllo

Ordina ha un'opzione che ti permette di controllare se l'input è ordinato. Ritorna dopo la prima istanza di una riga non ordinata. Nel caso in cui sia necessario ordinare l'input ma è probabile che sia già in ordine, l'uso del controllo di ordinamento è appropriato.

Opzione

--dai un'occhiata

Utilizzo

sort --check

Riga di comando

seq 10 | sort --ordinamento-casuale | sort --check

Produzione

sort: -:3: disordine: 10

Riga di comando

seq 10 | sort --ordinamento-casuale | ordina | sort --check

Produzione

(vuoto)

Ordina output

L'ordinamento ha un'opzione che ti consente di specificare un file su cui scrivere invece di utilizzare l'output standard o il reindirizzamento. Il suo utilizzo può migliorare la compatibilità tra ambienti di scripting.

Opzione

--output=FILE

Utilizzo

sort --output=FILE

Riga di comando

seq 10 | sort --random-sort --output=random-10

Produzione

(vuoto)

Ordina null terminato

Ordina ha un'opzione che ti consente di impostare il delimitatore di riga su null invece di una nuova riga.

Opzione

--zero-terminato

Utilizzo

sort --zero-terminated

Riga di comando

seq 10 | tr '\012' '\000' | sort --zero-terminated --random-sort

Produzione

25346178910

Ordina stabile

L'ordinamento ha un'opzione che ti consente di disabilitare il confronto dell'ultima risorsa. Di conseguenza, è possibile ottenere tempi di esecuzione più stabili nel caso di input sufficientemente grandi da causare l'instabilità dell'ordinamento.

Opzione

--stabile

Utilizzo

ordina --stabile

Riga di comando

sequenza temporale 1000000 | sort --ordinamento-casuale | sort --stable >/dev/null

Produzione

reale    0m9.138s
utente    0m9.201 secondi
sis     0m0.107s

Ordina le dimensioni del buffer

Ordina ha un'opzione che ti consente di impostare la quantità di memoria utilizzata come buffer durante l'ordinamento. Può essere utilizzato per limitare il consumo di memoria ordinando input più grandi. Le prestazioni potrebbero risentirne.

Opzione

--buffer-size=SIZE

Utilizzo

sort --buffer-size=64

Riga di comando

sequenza temporale 1000000 | sort -random-sort | sort -stable -buffer-size=64 >/dev/null

Produzione

reale    0m21.685 secondi
utente    0m9.858 secondi
sistema     0m2.092s

Ordina unico

Ordina ha un'opzione che ti consente di rimuovere le righe duplicate nell'output di ordinamento

Opzione

--unico

Utilizzo

sort --unico

Riga di comando

eco 1 2 2 4 5 | tr '\040' '\000' | sort --zero-terminated --unique

Produzione

1245

alternative

ordina | unico

Conclusione

Sortèun comando esterno utile non solo se usato in combinazione con altri comandi esterni ma è utile anche se usato con comandi senza un metodo di ordinamento integrato come una funzione definita dall'utente o script bash in generale.

Motori di gioco gratuiti e open source per lo sviluppo di giochi Linux
Questo articolo tratterà un elenco di motori di gioco gratuiti e open source che possono essere utilizzati per lo sviluppo di giochi 2D e 3D su Linux....
Tutorial Shadow of the Tomb Raider per Linux
Shadow of the Tomb Raider è la dodicesima aggiunta alla serie Tomb Raider, un franchise di giochi d'azione e avventura creato da Eidos Montreal. Il gi...
Come aumentare gli FPS in Linux?
FPS sta per Fotogrammi al secondo. Il compito dell'FPS è misurare il frame rate nelle riproduzioni video o nelle prestazioni di gioco game. In parole ...