Soru Unix Sıralamasıyla Bilimsel Numarayı Sıralama


Bu numarayı Unix sıralama ile sıralamaya çalıştım, ama işe yaramıyor:

    2e-13
    1e-91
    2e-13
    1e-104
    3e-19
    9e-99

Bu benim buyruğum:

sort -nr file.txt

Bunu yapmanın doğru yolu nedir?


17
2018-04-15 02:17


Menşei


Python, sort, key = lambda x: float (x) kullanın. Python tek gömlekler için kullanılabilir. Python'un hangi sürümü önceden yüklenmiştir? - Hamish Grubijan
@Hamish Grubijan - Muhtemelen bir cevap olarak + 1 yazmış olmalısın. GNU uzantılarına güvenmekten çok daha taşınabilir. - Tim Post♦
Teşekkürler, şimdi bitti. - Hamish Grubijan


Cevaplar:


kullanım -g (uzun biçim --general-numeric-sort) yerine -n. -g seçenek sayıları geçer strtod Değerlerini elde etmek için, bu formatı tanıyacaktır.

Bunun tüm uygulamalarda mevcut olup olmadığından emin değilim. sortya da sadece GNU olanı.


37
2018-04-15 02:20



Başlangıçta GNU merkezli olduğuna eminim, ama düşünemiyorum. sort Bu şimdi sunmuyor. Sorunlu olabilir, ama sadece çok eski sistemlerde düşünüyorum. - Tim Post♦
Eğer yardım ederse, bende centos 7 üzerinde çalışır. Teşekkürler. - jimh
Bu benim için 0 ve 0.1 doğru sıralamıyordu. Boruma LANG = C eklemek zorunda kaldı ... | LANG=C sort -g - user3132194


Eğer senin sort sahip değil -g, diğer yol.

$ printf "%.200f\n" $(<file) |sort -n |xargs printf "%g\n"
1e-104
9e-99
1e-91
3e-19
2e-13
2e-13

$ sort -g file
1e-104
9e-99
1e-91
3e-19
2e-13
2e-13

$ printf "%.200f\n" `cat file` |sort -n |xargs printf "%g\n"

8
2018-04-15 02:57





Sadece iki şey yap:

  1. kullanım -g (veya --general-numeric-sort) yapmak sort Exp-sayıları doğru bir şekilde uygulayın.
  2. kullanım LC_ALL=C. sort Verileriniz ASCII dışında bazı dile özgü semboller içeriyorsa, yerel ayarlara çok duyarlıdır. Kullanmak LC_ALL=C evrensel yaklaşımdır her kullandığınız sort, yapar sort Giriş akışını ikili olarak ele almak için herhangi bir sorun yaşamayacaksınız.

Yani evrensel çözüm:

cat file.txt | LC_ALL=C sort -gr | less

Ayrıca sıralamada bir takma isim yaptım .bashrc dosya:

alias csort="LC_ALL=C sort"

çok rahat kullanım için.


4
2018-02-10 21:41





Tamam, burada Python betiğinin tam olarak test edilmemiş bir versiyonu. Varsayılan kullanım:

sort_script.py file.txt

Ne yazık ki bunu Windows üzerinde geliştirdim ve Python'un 2 farklı sürümü yüklü olarak düzgün bir şekilde test edemiyorum. Uyarı: En yeni Python'u gerektirir (birlikte, yazdırma işlevleri eklendi veya değiştirildi). Not: Unix ile her zaman yönlendirme yapabiliyor olsanız da, back_to_file bayrağı isteğe bağlı bir parametre olabilir ... Windows'ta bile yapabilirsiniz.

#!/usr/bin/env python3.1
# Note: requires newer python

import sys

#Remove this line:
sys.argv = ('', 'file.txt')

assert(len(sys.argv) == 2)

with open(sys.argv[1], 'r') as fin:
    lines = fin.readlines()

lines_sorted = sorted(lines, key=lambda x: float(x))

back_to_file = False # Change this if needed

if back_to_file:
    with open(sys.argv[1], 'w') as fout:
        fout.writelines(lines_sorted)
else:
    for lns in lines_sorted:
        print(lns, end='') # Suppress new line

1
2018-04-15 14:10