LINUX.ORG.RU

как отсортировать числовую таблицу?

 , ,


0

1

имеется текстовая таблица с числами, каждый столбец через табуляцию

сначала я заметил, что sort -n игнорирует знаки

OK, написал через awk прибавление модуля наименьшего элемента в столбце к каждому элементу, потом сортировка, потом его вычитание

теперь заметил, что он сортирует по первым цифрам, например

102	
116	
150	
46	
66	
80	
91	

дальше продолжать писать костыли для sort'а нет желания, в связи с чем вопрос:

есть ли в командной строке UNIX что-нибудь специально для таких числовых таблиц? или вдруг может awk такое умеет?



Последнее исправление: cetjs2 (всего исправлений: 1)

@val_num_asc

anonymous
()

покажи вывод своего
sort --version
может он у тебя не гнутый.

bl ★★★
()
sort -g -k COLUMN_NUMBER
anonymous
()
Ответ на: комментарий от zolden
--> sort --version
sort (GNU coreutils) 8.23
Упакован Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <http://gnu.org/licenses/gpl.html>
Это свободное ПО: вы можете изменять и распространять его.
Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.

Авторы программы -- Mike Haertel и Paul Eggert.
--> locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_ALL=
FeelUs
() автор топика
Ответ на: комментарий от FeelUs

Упакован Cygwin (8.23-4)

брысь отсюда

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

это да

--> cat| sort -n
102
116
150
46
66
80
91
^D

46
66
80
91
102
116
150
но это нет
--> cat| sort -n
0       0       66
0       0       80
0       0       91
0       0       102
0       0       116
0       0       46
0       0       150
^D

0       0       102
0       0       116
0       0       150
0       0       46
0       0       66
0       0       80
0       0       91

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

man прочитай уже, что ли
sort -n -k3

anonymous
()
Ответ на: комментарий от FeelUs

Тебе man в слух и свыражением прочесть? ;)

$ cat <<EOF | sort -k3 -n | column -t 
0       0       66
0       0       80
0       0       91
0       0       102
0       0       116
0       0       46
0       0       150
EOF

0  0  46
0  0  66
0  0  80
0  0  91
0  0  102
0  0  116
0  0  150
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от beastie

сделал export LANG=un_US.UTF-8 - ситуация с отрицательными числами стала лучше

далее:

Упакован Cygwin (8.23-4)

брысь отсюда

на нормальном сервере на моих тестах sort ведет себя точно так же как и под цигвином:

--> sort --version
sort (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.

далее:

числа с разным кол-вом цифр не в первой строке все равно сортирует неправильно: (я хочу отсортировать сначала по первому столбцу, потом по второму, потом по третьему)

--> cat | sort -n
0       -0.7    46
0       -0.7    150
0       0.4     46
0       0.4     150
17      -0.7    46
17      -0.7    150
17      0.4     46
17      0.4     150


0       -0.7    150
0       -0.7    46
0       0.4     150
0       0.4     46
17      -0.7    150
17      -0.7    46
17      0.4     150
17      0.4     46

и еще sort - почему-то неустойчивая сортировка:

cat | sort -nk 3 | sort -nk 1
на предыдущем примере работает точно так же (как просто sort -n)

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

Конечно «неустойчивая». Сначала сортируешь так, всё выбрасываешь и сортируешь заново. ;)

$ cat <<EOF | sort -n -k1,1 -k2,2 -k3
0       0.4     46
0       0.4     150
0       -0.7    46
17      0.4     46
17      0.4     150
17      -0.7    46
17      -0.7    150
0       -0.7    150
EOF

0       -0.7    46
0       -0.7    150
0       0.4     46
0       0.4     150
17      -0.7    46
17      -0.7    150
17      0.4     46
17      0.4     150
beastie ★★★★★
()
Ответ на: комментарий от beastie

спасибо за внятное прочтение мана ;)

а стабильная сортировка все-таки есть с опцией -s

и заодно вопрос: как изменить LC_NUMERIC на en_US, а всё остальное оставить ru_RU?

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

Так и делаешь. ;)

export LC_NUMERIC=en_US.UTF-8

Для debian-based, что бы так было всегда, можешь добавить в /etc/defaults/locale

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