Come ordinare la stringa che combinata con stringa + numero usando script bash?


27

Questi sono i dati che desidero ordinare. Ma sortconsidera il numerico come stringa, i dati non sono ordinati come mi aspettavo.

/ home / files / profile1
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16
/ home / files / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9

Voglio ordinare questo,

/ home / files / profile1
/ home / files / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16

C'è un buon modo per bash script? Non posso usare lo script ruby ​​o python qui.


prova a usare "sort -nd"
bobah il

1
@bobah, "ordina: le opzioni` -dn 'sono incompatibili "
maxschlepzig

10
sort -Vfarebbe.
Thor,

2
@Thor. il tuo commento farebbe una buona risposta
Peter.O

Risposte:


21

È possibile utilizzare un carattere sentinella temporaneo per delimitare il numero:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

Qui, il personaggio sentinella è ';' - non deve far parte di alcun nome file che si desidera ordinare - ma è possibile scambiare ";" con qualsiasi personaggio che ti piace. Devi cambiare il sed, sorte trparte quindi di conseguenza.

La pipe funziona come segue: il sedcomando inserisce la sentinella prima di qualsiasi numero, il sortcomando interpreta la sentinella come delimitatore di campo, ordina con il secondo campo come chiave di ordinamento numerica e il trcomando rimuove nuovamente la sentinella.

E logindica il file di input: puoi anche reindirizzare il tuo input sed.


Mi piace il modo in cui hai risolto il problema :)
SHW,

44

Questo è molto simile a questa domanda . Il problema è che hai un campo alfanumerico su cui stai ordinando e -nnon lo tratta in modo sensato, come invece fa la versione sort ( -V). Quindi utilizzare:

sort -V

Nota che questa funzione è attualmente supportata dalle implementazioni di ordinamento GNU, FreeBSD e OpenBSD.


Sai quanto è portatile? Questa opzione non sembra far parte delle specifiche POSIX.
Ernest A

@ErnestA: Hai ragione, questa è la soluzione specifica per l'ordinamento GNU. Aggiunta una nota
Thor,

@ErnestA: Sembra che FreeBSD e OpenBSD abbiano aggiunto questa funzione.
Thor,

E non funziona se i numeri hanno prefissi diversi.
Dante,

1
A tutti i lettori: nota che si tratta di CAPITAL V! sort -VNon usare sort -v. È difficile da dire a prima vista.
Gabriel Staples,

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.