GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana mengurutkan keluaran ini 1,10,11..2

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.


Linux
  1. Bagaimana Cara Mengarahkan Output Program Ke File Zip??

  2. Bagaimana Cara Mengingat Cara Menggunakan Redirection?

  3. Urutkan Output Berdasarkan Kolom?

  1. Bagaimana cara menyimpan output dari perintah awk ini ke file?

  2. Bagaimana saya bisa mengurutkan output du -h berdasarkan ukuran

  3. Cara grep keluaran ps dengan header

  1. Cara Menetapkan Output dari Perintah Linux ke Variabel

  2. Bagaimana Cara Membuat Output Virtual Di Pulseaudio?

  3. Bagaimana cara menghentikan keluaran ping?