Bagaimana cara mengurutkan file, berdasarkan nilai numeriknya untuk suatu bidang?


114

Contoh file.txt:

  100 foo
  2 bar
  300 tuu

Saat menggunakan sort -k 1,1 file.txt, urutan garis tidak akan berubah, meskipun kami mengharapkan:

  2 bar
  100 foo
  300 tuu

Bagaimana cara mengurutkan bidang yang terdiri dari angka berdasarkan nilai numerik absolut?

Jawaban:


149

Lihat halaman manual untuk mengurutkan ...

   -n, --numeric-sort
          compare according to string numerical value

Jadi inilah contohnya ...

sort -n filename

1
Terima kasih semuanya! Ini berkabel, karena saya melihat halaman manualnya bolak-balik beberapa kali dan saya tidak melihat opsi itu. Ah, saya berada di halaman manual yang disederhanakan. Sial!
lukmac

1
Harap dicatat bahwa, untuk floating point, penggunaan -g, --general-numeric-sortbisa lebih disarankan. Hal ini selanjutnya memungkinkan adanya notasi ilmiah misalnya 1.234E10 dll.
Herpes Free Engineer

103

Jika Anda mengurutkan string yang merupakan teks & angka campuran, misalnya nama file log bergulir, maka pengurutan sort -ntidak berfungsi seperti yang diharapkan:

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

Dalam hal ini opsi -Vmelakukan trik:

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

dari halaman manual:

   -V, --version-sort
          natural sort of (version) numbers within text

1
Ini membuat saya tersandung, jadi terima kasih! Hal lain yang mengacaukan saya, setidaknya di cygwin saya, adalah bahwa bahkan ketika menyalurkan lsmelalui sedsubstitusi untuk menghapus huruf dan hanya menyisakan angka, ternyata keluaran berwarna juga mempengaruhi banyak hal. Jadi, berlari ls --color=neverjuga membuat perbedaan.
Max Starkenburg

Luar biasa, -Vpersis seperti yang saya cari. Saya harus membiasakan untuk melihat-lihat halaman manual terlebih dahulu.
srowley

18

Nah, sebagian besar jawaban lain di sini mengacu pada

sort -n

Namun, saya tidak yakin ini berfungsi untuk angka negatif. Berikut hasil yang saya dapatkan dengan mengurutkan versi 6.10 di Fedora 9.

File masukan:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Keluaran:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Yang jelas tidak diurutkan berdasarkan nilai numerik.

Kemudian, saya kira jawaban yang lebih tepat akan digunakan sort -ntetapi hanya jika semua nilainya positif.

PS: Menggunakan sort -gmengembalikan hasil yang sama untuk contoh ini

Edit:

Sepertinya pengaturan lokal mempengaruhi bagaimana tanda minus mempengaruhi pesanan ( lihat di sini ). Untuk mendapatkan hasil yang tepat, saya baru saja melakukan:

LC_ALL=C sort -n filename.txt



1

Anda harus melakukan perintah berikut:

sort -n -k1 filename

Itu harus dilakukan :)


-1

Gunakan sort -nr untuk mengurutkan dalam urutan menurun. Lihat

Menyortir

Lihat halaman Man di atas untuk referensi lebih lanjut


-4
    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done

1
Mau menambahkan sedikit penjelasan teks tentang fungsi kode ini?
Stedy
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.