perintah sort di unix dengan sorting numerik


10

Saya punya file1:

"$lvl=57"
"$lvl=20"
"$lvl=48"
"$lvl=17"
"$lvl=58"

File2 yang saya inginkan:

"$lvl=17"
"$lvl=20"
"$lvl=48"
"$lvl=57"
"$lvl=58"

Pada dasarnya mengurutkan file1 secara numerik.


Ketika saya menjalankan Unix biasa sortpada File1 Anda, tanpa opsi, saya mendapatkan File2 Anda. Apa yang kamu lakukan secara berbeda? Apa yang Anda tinggalkan dari pertanyaan ini?
Scott

Jawaban:


17

Saya suka -V --version-sort: ini berperilaku sangat baik untuk banyak situasi yang menggabungkan string dan angka

sort -V

Saya menggunakan opsi ini sangat sering ...

Di beberapa arah, ls -vuntuk versi-sortir ls.


10

Anda perlu memberi tahu sort -nuntuk menyortir bagian setelah =:

sort -t = -k 2n

Saya baru-baru ini mencari ini ^^. Tapi satu lagi Q. Apa yang harus dilakukan -k2n? Apakah itu terkait dengan pengurutan angka? Terima kasih.
αғsнιη

2
@KasiyA -kmendefinisikan kunci pengurutan. Lihat halaman manual untuk detailnya. -k2nmendefinisikan kunci pengurutan mulai dari bidang kedua dan berakhir di akhir baris dan menjadikannya kunci pengurutan angka.
Stéphane Chazelas

0

gunakan sortir:

sort -n file1 > file2

-n, --numeric-sort
membandingkan menurut nilai numerik string

 sort -g file1 > file 2

-g, --general-numeric-sort


3
Tidak, semua baris tersebut memiliki peringkat yang sama sort -nkarena mereka tidak memulai dengan angka. Alasannya memilah mereka adalah jenis garis penuh resor-terakhir (leksikal, tidak numerik) dilakukan untuk baris dengan peringkat yang sama. Itu akan menyortir "$lvl=17"sebelumnya "$lvl=2".
Stéphane Chazelas

@ StéphaneChazelas terima kasih telah menunjukkan.
Hackaholic

Mengutip, -ndan -gberlebihan di sini karena input tidak numerik. Jadi jawaban ini menyesatkan, maka downvote (perhatikan juga -gdan opsi panjangnya khusus untuk GNU).
Stéphane Chazelas

tapi -g adalah jenis umum-numerik yang bagus
Hackaholic

Itu masih untuk mengurutkan nilai numerik, bedanya -nadalah bahwa itu tidak terbatas pada bilangan bulat desimal. Itu masih akan disortir "$lvl=17"sebelumnya "$lvl=2"sebagai bagian dari penyortiran resor terakhir.
Stéphane Chazelas

0

Saya menemukan bahwa, Anda jalankan saja sort -h, itu akan berhasil. Mereka menyebutnya --human-numberic-sort.

sort -h file1 > file2

-1

sort -nadalah apa yang ingin Anda gunakan. Ini semacam kita mengurutkan angka.sort -k 2 -n file1


2
Tetapi OP ingin menyortir dalam urutan menaik, yang merupakan default. Mengapa Anda menyarankan pesanan terbalik?
G-Man Mengatakan 'Reinstate Monica'

di atas benar ketika bidang dipisahkan dengan tab atau spasi dan tidak akan berfungsi dalam kasus OP.
αғsнιη
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.