2013-06-05 11 views
5

Ho una lista di file con un numero di versione alla fine che ho bisogno di ordinarebash lista sorta di stringhe per numero alla fine

/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 

quando ho tubo attraverso grep è sorta in questo modo:

echo $files | sort -n 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 

Penso che -n si stia confondendo con il primo numero nel nome del file.

Come posso ordinare numericamente per l'ultimo numero

+0

sempre la stessa profondità di percorso? – Kevin

+0

sì, ma non conosco la profondità fino a quando non sto cercando di ordinare –

risposta

11
Kaizen ~/so_test $ cat ztestfile1 | sort -t'/' -n -k10 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 

fa questo aiuto?

modo alternativo cioè di essere indipendente dalla posizione .....

Kaizen ~/so_test $ cat ztestfile1 | sort -V 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 

si prega di notare la sua una -V (Capital) opzione in genere che guarda in differenze numerici in una stringa per ordinare ... .. come nel numero di versione.

uomo pagina di testo ::

-V, --version-sort 
      natural sort of (version) numbers within text 
+0

questo è quello che stavo provando tranne che stavo andando dal man page e disponeva di spazi extra 'sort -n -t '/' -k 10' e apparentemente l'ordinamento non piace a quello –

+0

ohh ok, sembra che il problema sia risolto ora ... :) – nsd

+0

Essere consapevoli che con questo tipo di soluzione devi conoscere e specificare la profondità dei file. – michas

3

È possibile utilizzare / come separatore di colonna:

sort -n -t/ -k 10 
+0

hai vinto .... la tua risposta è stata 1 minuto prima di noi :) +1 – nsd

1

Usa awk per portare l'ultimo campo in avanti, sort dal 1 ° campo , quindi applicare cut per sbarazzarsi del primo campo. Un esempio utilizzando un here document sotto

awk -F'/' '{print($NF"/"$0)}' <<! | sort -k1n,1n -t'/' | cut -f2- -d'/' 
> /this/is/a/file/path/product-2.0/file/name/7 
> /this/is/a/file/path/product-2.0/file/name/10 
> /this/is/a/file/path/product-2.0/file/name/12 
> /this/is/a/file/path/product-2.0/file/name/13 
> /this/is/a/file/path/product-2.0/file/name/6 
> /this/is/a/file/path/product-2.0/file/name/8 
> /this/is/a/file/path/product-2.0/file/name/9 
> ! 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
0

Questo si ottiene allineati secondo l'ultimo elemento nel percorso utilizzando / come separatore di campo, prendendo l'ultimo valore e ponendolo all'inizio della linea, di smistamento , quindi rimuovendo il valore dall'inizio della riga.

cat data | awk 'BEGIN { FS="/"} { print $(NF) " " $0 }' | sort -n | sed 's/^.*\s//g' 
0

Oppure utilizzare un qualcosa che uno-liner come Perl o Ruby:

ruby -we 'print *readlines.sort_by{|x| File.basename(x).to_i}' 
Problemi correlati