2016-07-19 2 views
1

У меня есть файл с положительными числами, отрицательные числа и цифры в научной нотации, все в том же столбце. Я хочу сортировать его по абсолютной величине числа, учитывая научную нотацию.сортировка числовая колонка на основе абсолютных значений и научной нотации

Для примера рассмотрим этот файл:

cat foo 

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

Я пробовал:

sort foo 

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

Это рассматривает положительные и отрицательные числа, как же (= абсолютное значение, которое я хочу); но игнорирует научную нотацию.

.

sort -n foo 

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

Это относится к положительным и отрицательным значениям и игнорирует научную нотацию. Это противоположность тому, что я хочу.

.

sort -g foo 

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

Это относится к научной нотации (которой я хочу), но также относится к положительным и отрицательным значениям.

.

Выход я хочу будет выглядеть следующим образом:

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

Это уважающего научной нотации, но рассматривает положительные и отрицательные числа одинаковы.

Я прочитал документацию по сортировке, но я не могу найти ответ.

Я использую Баш версии 4.1.2

Благодарности

ответ

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

Идея состоит в том, чтобы преобразовать каждое отрицательное число -123 в 123-, затем отсортировать численно (что игнорирует конечный -), затем отмените преобразование.

+0

Спасибо всем. Я выбираю этот ответ, потому что он использует sed и сортировку, с которой я немного больше знаком. Кроме того, есть объяснение того, что делает код. Что касается деталей кода, мог бы кто-то уточнить значение этих двух выражений в sed: 1) (. *) [С escaped()] и 2) символ $? – Mau

0

Вот perl решение, потому что я думаю, что это не так легко сделать это в чистом bash:

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

Спасибо. это тоже работает. Выглядит достаточно просто, но я ничего не имею о perl. – Mau

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

Спасибо. оно работает. Раньше я никогда не слышал о рубине. – Mau

+0

@Mau, Ruby - величайший язык программирования. (Ahem. Lol.) Он используется для всего, от командного сценария до написания огромных веб-приложений. Это язык Rails написан, и, наряду с Javascript, это тот, который все эти разработчики Rails используют. Это один из немногих языков * all-is-an-object * и * object-based-from-day-1 *. – DigitalRoss

+0

Интересно. Благодарю вас за информацию! – Mau

Смежные вопросы