Taruhan terbaik Anda adalah menyalurkan ke GNU sort , dengan GNU sort --version-sort opsi diaktifkan
jadi itu akan menjadi oracleasm listdisks | sort --version-sort
Dari halaman info
--version-sort’
Sort by version name and number. It behaves like a standard sort,
except that each sequence of decimal digits is treated numerically
as an index/version number. (*Note Details about version sort::.)
Atas masukan Anda, itu memberi saya
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3
Jika sort --version-sort tidak tersedia, pisahkan menjadi 2 bidang:bidang 1 =awalan non-digit, dan bidang 2 =bilangan bulat, dan cetak bidang dengan TAB di antaranya. Kemudian gunakan sort pada 2 bidang yang dibatasi TAB, lalu hapus TAB. Terhubung dengan pipa untuk menghindari overhead I/O. Berikut adalah contoh dengan potongan minimal data dari OP, ditambah beberapa catatan tambahan:
echo 1 10 2 11 DATA DATA1 DATA10 DATA11 DATA2 FRA FRA1 FRA10 FRA11 FRA2 | \
xargs -n1 | \
perl -lne 'print join "\t", /(\D*)(\d*)/' | \
sort -k1,1 -k2,2n | \
perl -pe 's/\t//'
Cetakan:
1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11
DETAIL:
Perl one-liners menggunakan flag baris perintah ini:
-e :memberi tahu Perl untuk mencari kode dalam baris, bukan dalam file.
-n :mengulangi input satu baris pada satu waktu, menugaskannya ke $_ secara default.
-l :hapus pemisah baris input ("\n" pada *NIX secara default) sebelum mengeksekusi kode sebaris, dan menambahkannya saat mencetak.
-p :sama dengan -n , tetapi juga print baris di akhir setiap loop (menghilangkan print eksplisit ).
Di dalam baris pertama, \d adalah digit apa saja (0-9), dan \D adalah setiap non-digit. Setiap pola ini diulang 0 kali atau lebih (menggunakan * ). Kedua pola ditangkap menggunakan tanda kurung dan dikembalikan sebagai LIST dari dua bidang, yang digabungkan pada TAB dan dicetak.
Perl one-liner kedua hanya menghapus TAB pertama yang ditemukan tanpa apa-apa (string kosong) dan mencetak baris.
Ke sort pada 2 kolom, opsi ini digunakan:-k1,1 :urutkan pada bidang 1 ASCIIbetik. Kemudian:
-k2,2n :jika kolom 1 sama, urutkan pada kolom 2 secara numerik (-n pilihan).
Perhatikan bahwa nomor bidang diulang dua kali (mis., 1,1 ), untuk mencegah pengurutan pada sisa baris dan membatasi pengurutan hanya pada nomor kolom ini.