2016-07-19 7 views
1

Ich habe eine Datei mit positiven Zahlen, negativen Zahlen und Zahlen in wissenschaftlicher Notation, alle in der gleichen Spalte. Ich möchte es nach dem absoluten Wert der Zahl sortieren, unter Berücksichtigung der wissenschaftlichen Notation.sortieren numerische Spalte basierend auf absoluten Werten und wissenschaftliche Notation

Betrachten wir zum Beispiel diese Datei:

cat foo 

7.70488617137843e-05 
-8.50387220311822 
0.1 
-3.3453262e-02 

ich versucht habe:

sort foo 

0.1 
-3.3453262e-02 
7.70488617137843e-05 
-8.50387220311822 

Diese behandelt positive und negative Zahlen als gleich (= absoluter Wert, was ich will); aber ignoriert wissenschaftliche Notation.

.

sort -n foo 

-8.50387220311822 
-3.3453262e-02 
0.1 
7.70488617137843e-05 

Dies berücksichtigt positive und negative Werte und ignoriert wissenschaftliche Notation. Das ist das Gegenteil von dem, was ich will.

.

Dies respektiert wissenschaftliche Notation (die ich will), sondern auch positive und negative Werte.

.

Der Ausgang Ich werde aussehen wie wünschen:

7.70488617137843e-05 
-3.3453262e-02 
0.1 
-8.50387220311822 

Diese respektiert wissenschaftliche Schreibweise, sondern behandelt positive und negative Zahlen gleich.

Ich habe die Sortier-Dokumentation gelesen, aber ich kann keine Antwort finden.

Ich benutze bash Version 4.1.2

Dank

Antwort

0
sed 's/^-\(.*\)/\1-/' | sort -g | sed 's/^\(.*\)-$/-\1/' 

Die Idee ist, jede negative Zahl -123 in 123- umzuwandeln und dann numerisch zu sortieren (was die nachlaufende 012 ignoriert)), machen Sie die Umwandlung rückgängig.

+0

Danke euch allen. Ich wähle diese Antwort, weil sie sed und sort verwendet, mit denen ich ein bisschen mehr vertraut bin. Außerdem gibt es eine Erklärung, was der Code tut. In Bezug auf die Codedetails könnte jemand die Bedeutung dieser beiden Ausdrücke in sed weiter ausführen: 1) (. *) [Mit Escapezeichen() und 2) das $ -Symbol? – Mau

0

Hier ist eine perl Lösung, weil ich denke, dass es nicht so einfach ist es in reinen bash zu tun:

perl -e 'print sort { abs($a) <=> abs($b) } <>' foo 
+0

Danke. Das funktioniert auch. Sieht einfach aus, aber ich habe nichts von perl – Mau

0
ruby -e 'puts (IO.readlines "sn.txt").sort_by { |e| e.to_f.abs }' 
+0

Danke. Es klappt. Ich habe noch nie von Ruby gehört. – Mau

+0

@Mau, Ruby ist die größte Programmiersprache aller Zeiten. (Ähem. Lol.) Es wird für alles vom Befehlsscripting bis zum Schreiben riesiger Webanwendungen verwendet. Es ist die Sprache, in der Rails geschrieben ist, und zusammen mit Javascript ist es diejenige, die alle Rails-Entwickler verwenden. Es ist eine der wenigen * Alles-ist-ein-Objekt * und * Objekt-basiert-von-Tag-1 * Sprachen. – DigitalRoss

+0

Interessant. Danke für die Info! – Mau

Verwandte Themen