LINUX.ORG.RU
решено ФорумAdmin

Сортировка файла по столбцу в экспоненциальном формате

 , ,


0

1

Доброго времени суток, есть файл содержащий строки вида:

WR00C2L2        9984   128     1     2              44.89              1.478e+01
нужно отсортировать его по последнему столбцу. Пробовал:
cat file|sort -g -k7
cat file|perl -e 'print sort{substr($a, -9)+0.<=>substr($b, -9)+0.} <>'
Оба варианта работают неверно

man sort -g

anonymous
()

Если хочется на Перле, то можно так:

perl -lane 'push @lines, {line => $_, exp => $F[-1]}; END{ print $_->{line} for sort { $a->{exp} <=> $b->{exp} } @lines }' file.txt

Или так:

perl -lnE 'push @l, $_; END{ say for sort { (split(/\s+/, $a))[-1] <=> (split(/\s+/, $b))[-1] } @l }' file.txt

evbogdanov
()

Вангую, что можно заменить 'e' на табуляцию и потом сортировать по последнему столбцу (который после 'e' - экспонента) и по предпоследнему (который перед 'e' - множитель). Но это сработает только если множитель всегда больше-равен 1 и меньше 10. Как-то так:

$ cat numbers.txt
one     2       1.5e+01
two     1       1.1e+01
three   4       1.1e+02
four    +1      1.1e+10
five    -2      7.1e-01
six     3       9.9e+00

$ cat numbers.txt | sed 's/\([0-9]\)e/\1\t/g' | sort -g -k4 -k3 | sed 's/\t\([+-][0-9]\+$\)/e\1/g'
five    -2      7.1e-01
six     3       9.9e+00
two     1       1.1e+01
one     2       1.5e+01
three   4       1.1e+02
four    +1      1.1e+10

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)

″sort -g″ должен работать правильно, разве что кривая локаль может влиять.

Дайте пример, где он работает неправильно, и его версию.

mky ★★★★★
()

sort -g
Оба варианта работают неверно

Или ты сейчас признаешься, что был неправ и извинишься, или выкладываю сюда своё «неверно».

anonymous
()

cat file|sort -g -k7

cat file | LANG=C sort -g -k7
arson ★★★★★
()
Ответ на: комментарий от mythCreator

Если выставить LANG=C

В общем то, так и должно быть. Правда в документации к sort пишут про LC_NUMERIC, но это не важно, каким образом указывать что в качестве разделителя стоит десятичная точка, а не запятая.

Ну и помните, что числа должны укладыватся в double float.

mky ★★★★★
()
Ответ на: комментарий от mky

Теперь понял в чем дело. Спасибо всем отписавшимся ИТТ.

mythCreator
() автор топика
Ответ на: комментарий от mky

помните, что числа должны укладыватся в double float

На самом деле в long double.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.