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?

lukmac
sumber

Jawaban:

149

Lihat halaman manual untuk mengurutkan ...

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

Jadi inilah contohnya ...

sort -n filename
Andrew White
sumber
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
TMG
sumber
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
pgilmon
sumber
7

Anda harus menggunakan opsi sortir numerik:

sort -n -k 1,1 File.txt
Kai Sternad
sumber
3

Gunakan sort -natau sort --numeric-sort.

Roman Cheplyaka
sumber
1

Anda harus melakukan perintah berikut:

sort -n -k1 filename

Itu harus dilakukan :)

amc
sumber
-1

Gunakan sort -nr untuk mengurutkan dalam urutan menurun. Lihat

Menyortir

Lihat halaman Man di atas untuk referensi lebih lanjut

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