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.