LINUX.ORG.RU

Эмуляция sort -h на более ранних версиях

 


0

1

Я плохо разбираюсь в терминах сортировки, поэтому не могу описать требуемый результат правильными словами. Писал скрипт под заказ и в моей ОС команда sort имеет параметр "-h", а вот в среде клиента sort оказалась более древней, при чём нет способа её заменить/обновить. Плюс ко всему этому sort стоит в конвейере:

sort -h source | sed > txt

Файл source по структуре является CSV, в котором первым элементом идёт число из диапазона {1..n}, а разделитель - «|». Простой сорт даёт результат вида: 1, 10, 11, 100, 101, 2, 21, 3 и так далее, а нужен порядковый ход: 1, 2, 3, 10, 11, 21, 100, 101... Как можно эмулировать «sort -h» на старых версиях?

★★

а вот в среде клиента sort оказалась более древней

Ну это смелое заявление. По стандарту -h в sort может и не быть. Чтобы избежать таких неловкостей в дальнейшем, рекомендую установить manpages-posix[-dev].

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

Это подходит при условии отсутствия нолей в начале числа. У меня нет гарантии что у клиента в обрабатываемом файле не появятся строки, начинающиеся на ноль или два ноля (банальный человеческий фактор). sort -n не устраивает тем, что все строки, начинающиеся нолями выкидывает в начало документа, а обрезать начальные ноли нельзя... Потому и пользовался «человеческой» сортировкой, чтобы в случае «не корретной» строки в источнике у меня не рушился порядок номеров:

...
50|ghkj
051|fgh;
52|zcvju
00053|zcvjiytr
...
Но так как клиент отдельно этого не обсуждал - можно перевесить возможные проблемы на него, но неприятный осадок останется.

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

Благодарю за науку, но не факт, что с моим отношением это реально поможет. Однако обещаю попробовать исправиться.

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

sort -n не устраивает тем, что все строки, начинающиеся нолями выкидывает в начало документа

Неправда.

sort(p)

-n     Restrict  the  sort key to an initial numeric string, consisting
       of optional <blank>s, optional minus sign, and zero or more dig-
       its  with  an  optional radix character and thousands separators
       (as defined in the current locale), which  shall  be  sorted  by
       arithmetic  value.  An  empty  digit  string shall be treated as
       zero.  Leading zeros and signs on zeros shall not affect  order-
       ing.
anonymous
()
Ответ на: комментарий от anonymous

Неправда?

:~$ cat 123
1|sfth
10|jtej
11|zdfhert
100|etyjwefg
101|wgfjsdfgi
2|fgheriw
21|dfghteyh
3|sfghfghdf
01|sdfhr
0001|yf
0|qwer
:~$ cat 123 | sort -n
0|qwer
0001|yf
01|sdfhr
1|sfth
2|fgheriw
3|sfghfghdf
10|jtej
11|zdfhert
21|dfghteyh
100|etyjwefg
101|wgfjsdfgi
zzdnx ★★
() автор топика
Ответ на: Неправда? от zzdnx

Лог теста выше ^_^

Теория - это когда всё понятно, но ничего не работает.

Практика - это когда всё работает, но ничего не понятно.

Когда теория встречается с практикой - ничего не работает и ничего не понятно.

zzdnx ★★
() автор топика
Ответ на: Неправда? от zzdnx
extensa tmp # sort -n test
1|ololo
2|fdfgdsfds
3|ghrethgd
4|hr7wghsbgxc
5|gesgsdfgs
07|grsgtertgsdr
12|heruhvchx
17|he3uhdsg
000018|gh3ertyhdgs
31|gfesgtewrg
0032|hgwtyuerth
45|ht5uijgfdhdf
67|ghtrhghxgc

extensa tmp # busybox sort -n test
1|ololo
2|fdfgdsfds
3|ghrethgd
4|hr7wghsbgxc
5|gesgsdfgs
07|grsgtertgsdr
12|heruhvchx
17|he3uhdsg
000018|gh3ertyhdgs
31|gfesgtewrg
0032|hgwtyuerth
45|ht5uijgfdhdf
67|ghtrhghxgc

Все отлично.

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

Log

cat 123 | busybox sort -n
0|qwer
0001|yf
01|sdfhr
1|sfth
2|fgheriw
3|sfghfghdf
10|jtej
11|zdfhert
21|dfghteyh
100|etyjwefg
101|wgfjsdfgi

Ну что не так делаю? Неужели даже сегодня можно напороться на такую ветряную мельницу!?

zzdnx ★★
() автор топика
Ответ на: Log от zzdnx

Ну что не так делаю? Неужели даже сегодня можно напороться на такую ветряную мельницу!?

не приводите, как должно быть

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

не приводите, как должно быть

Дорогой анонимус, посылаю Вас в... Шапку темы. Прошу перечитывать до просветления - там написано что именно мне было нужно. Без примеров. И «sort -n» я пробовал в первую очередь.

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

У тебя единственные строки, начинающиеся с нуля - это 0, 0001 и 01. Они самые первые, потому как самые маленькие.

Проспись.

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

У меня гента, если что. Хотя не думаю, что это так важно. Оригинал:

1|ololo
2|fdfgdsfds
07|grsgtertgsdr
31|gfesgtewrg
0032|hgwtyuerth
5|gesgsdfgs
3|ghrethgd
4|hr7wghsbgxc
000018|gh3ertyhdgs
17|he3uhdsg
12|heruhvchx
45|ht5uijgfdhdf
67|ghtrhghxgc

devl547 ★★★★★
()
Последнее исправление: devl547 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Хорошо, проспался. А как быть с этим?

:~$ cat 123
1|sfth
10|jtej
11|zdfhert
100|etyjwefg
101|wgfjsdfgi
2|fgheriw
21|dfghteyh
3|sfghfghdf
01|sdfhr
0001|yf
0|qwer
02|f
085|fsh

:~$ busybox sort -n 123
0|qwer
0001|yf
01|sdfhr
1|sfth
02|f
2|fgheriw
3|sfghfghdf
10|jtej
11|zdfhert
21|dfghteyh
085|fsh
100|etyjwefg
101|wgfjsdfgi
02 в оригинале прописана ПОСЛЕ 2, но отсортирована по так, что оказалась раньше. ЧТД - ноли при такой сортировке идут вверх.

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

Как можно эмулировать «sort -h» на старых версиях?

sort -n и sort -h сортируют этот пример абсолютно одинаково.

sort -n не устраивает тем, что все строки, начинающиеся нолями выкидывает в начало документа
02 в оригинале прописана ПОСЛЕ 2, но отсортирована по так, что оказалась раньше.

Ты уж определись.

Для этого есть ключ -s, но не факт, что он есть и в старой версии.

Но так как клиент отдельно этого не обсуждал

Возьми да обсуди.

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

В моих слова не было никакого противоречия или неопределённости. Мне нужно чтобы документ был сортирован по первому элементу. Если в начале элемента присутствуют ноли - они должны игнорироваться, а при появлении двух строк с началами «число» и «ноль*n-число» соответственно (или наоборот: «ноль-число» и «чило») они должны остаться в том порядке, в котором пришли к сортировщику.

В принципе проблема полностью решена простой комбинацией «sort -s -n». Так что извиняюсь за нубизм и уползаю работать. Большое спасибо!

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