2009-11-17 2 views
26

mit einem früheren Bash-Skript habe ich eine Liste von Dateien:Bash und Dateien sortieren, um

data_1_box 
data_2_box 
... 
data_10_box 
... 
data_99_box 

die Sache ist jetzt, dass ich sie verketten müssen, so habe ich versucht,

ls -l data_ *

aber ich bekomme

..... 
data_89_box 
data_8_box 
data_90_box 
... 
data_99_box 
data_9_box 

aber ich brauche in der sucession 1, 2, 3, 4, .. 9, ..., 89, 90, 91, zu erhalten ... , 99

Kann es in bash getan werden?

Antwort

47
ls data_* | sort -n -t _ -k 2 

-n: numerisch
-t Sorten: Sortiere auf zweites Feld, in deinem Fall die Zahlen nach dem ersten '_'

+0

ja !! das hat den Trick gemacht, danke! – flow

+0

Ich habe 'sort' seit Jahren benutzt, habe mich nie darum gekümmert, die Manpage zu lesen - scheint mir wirklich verpasst zu haben. Vielen Dank! :-) – ssc

2

Dies ist eine allgemeine Antwort! Sie haben Recht den besonderen Satz von Daten

ls | sort 

Beispiel anwenden: Feldtrenn '_'
-k:

ls | sort -n -t _ -k 2 
+0

-1? Ich wechselte zu -l, aber ich bekomme die Ergebnisse nicht in dieser Reihenfolge – flow

+0

Hast du tatsächlich * versuchen * das? – paxdiablo

+0

wenn ein Versuch ls -1 | sort -n ich ... data_89_box data_90_box ... data_99_box data_9_box (Ende) , aber ich würde sie in der angegebenen Reihenfolge – flow

7

Wenn deine sort Version sort hat, tr y:

ls -1 | sort -V 

(das ist ein Kapital V).

19

Wie wäre es mit der -v Flagge zu ls? Der Zweck der Flag-Dateien nach Versionsnummer zu sortieren, aber es funktioniert genauso gut hier und beseitigt die Notwendigkeit, Rohr das Ergebnis sort:

ls -lv data_* 
-1

Ein Vorschlag, den ich denken kann, ist dies:

for i in `seq 1 5` 
do 
    cat "data_${i}_box" 
done 
1

Hier ist der Weg, um es in bash zu tun, wenn Ihre Art nicht Version Art hat:

cat <your_former_ls_output_file> | awk ' BEGIN { FS="_" } { printf("%03d\n",$2) }' | sort | awk ' { printf("data_%d_box\n", $1) }' 

Alle in einer Zeile. Denken Sie daran, dass ich dies nicht anhand Ihrer spezifischen Daten getestet habe. Es könnte daher ein wenig Optimierung erforderlich sein, um für Sie richtig zu arbeiten. Dies umreißt eine gute, robuste und relativ einfache Lösung. Natürlich können Sie den cat + -Dateinamen am Anfang jederzeit mit dem tatsächlichen ls austauschen, um die Dateidaten im laufenden Betrieb zu erstellen. Um die tatsächliche Dateinamensspalte zu erfassen, können Sie zwischen den korrekten ls-Parametern oder dem Piping über cut oder awk wählen.

1

möglicherweise mögen Sie SistemaNumeri.py ("Fix-Nummern"): es umbenennt Ihre

data_1_box 
data_2_box 
... 
data_10_box 
... 
data_99_box 

in

data_01_box 
data_02_box 
... 
data_10_box 
... 
data_99_box