bash сортировка кольцевая

Модератор: Модераторы разделов

Ответить
Аватара пользователя
yoricI
Сообщения: 2345
ОС: gentoo fluxbox

bash сортировка кольцевая

Сообщение yoricI »

Здравствуйте!
Подскажите пож-ста, как организовать кольцевую сортировку. Суть такова - в каталоге создаются файлики 001....999, которые надо обрабатывать по порядку, даже не обязательно по порядку, но не затрагивая последнего, в который пишутся данные. А могут и не писаться, режим ожидания, но файлик уже существует. Сортировка по временам доступа/модификации не подходит, могут совпадать вплоть до миллисекунд. Единственно надёжный критерий - имя, эти самые 001...999. В одномоментном снимке содержания каталога при одновременном наличии 001 и 999 они отсортируются неверно при обычной сортировке, надо наоборот, сначала 999, потом 001. Подкиньте идею, кто может))

На что меня хватило. До 999 работает, дальше нет.
mv `ls -1d $RECDIR/* | head -n1` $PROCDIR

Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: bash сортировка кольцевая

Сообщение drBatty »

yoricI писал(а):
18.03.2014 20:25
Подскажите пож-ста, как организовать кольцевую сортировку. Суть такова - в каталоге создаются файлики 001....999, которые надо обрабатывать по порядку

$

$ for f in *; do file $f; done 001: empty 002: empty 005: empty



yoricI писал(а):
18.03.2014 20:25
надо наоборот

$

$ while read f; do file $f; done < <(ls) 001: empty 002: empty 005: empty $ while read f; do file $f; done < <(ls -r) 005: empty 002: empty 001: empty



мощный вариант:

$

$ while read f; do file $f; done < <(find -type f -printf "%f\n" | sort -nr) 20: empty 005: empty 03: empty 002: empty 001: empty

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
yoricI
Сообщения: 2345
ОС: gentoo fluxbox

Re: bash сортировка кольцевая

Сообщение yoricI »

Это ж всё аналоги ls-сортировки, обычной по ранжиру)) По кольцу 001->999->001 и т.д. Это ж получается LILO (загрузчик ни при чём)), last in last out) Причём может накапливаться в каталоге до десятка необработанных файлов.
В инете негусто почему-то про кольцевую сортировку. Или я это несуразное название придумал? Попробую LILO поискать.

Ага, при некоторых раздумьях, это всё-таки не сортировка нужна, а именно буфер LILO, сортировка тут вторична. НО в чистом виде LILO невозможен, так как недостоверные таймстампы, вот против этого и нужна сортировка. ВОзможен ли стек на шелле? :ohmy:
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: bash сортировка кольцевая

Сообщение drBatty »

yoricI писал(а):
19.03.2014 11:05
Или я это несуразное название придумал?

this

yoricI писал(а):
19.03.2014 11:05
Ага, при некоторых раздумьях, это всё-таки не сортировка нужна, а именно буфер LILO, сортировка тут вторична. НО в чистом виде LILO невозможен, так как недостоверные таймстампы, вот против этого и нужна сортировка. ВОзможен ли стек на шелле?

да. Вот только LILO это НЕ стек, а очередь. Вот вам стек(LIFO):

Код: Выделить всё

#!/bin/bash

declare -a STACK

SP=0
X=

push()
{
    STACK[$SP]="$1"
    (( SP++ ))
}

pop()
{
    (( SP-- ))
    X="${STACK[$SP]}"
}

for S in "first" "second" "third"; do
    push "$S"
done

while (( SP != 0 )); do
    pop
    echo "$X"
done


какой нафиг "lilo"??? LIFO!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: bash сортировка кольцевая

Сообщение drBatty »

PS: FIFO на массиве сделать естественно не получится, если только не известен максимальный размер очереди.

вот на 100

Код: Выделить всё

#!/bin/bash

declare -a QUEUE

X=

BEGIN=0
END=0
S_SIZE=100

append_queue()
{
    QUEUE[$END]="$1"
    (( END++ ))
    if (( END >= S_SIZE )); then
        END=0
    fi
}

remove_queue()
{
    X="${QUEUE[$BEGIN]}"
    (( BEGIN++ ))
    if (( BEGIN >= S_SIZE )); then
        BEGIN=0
    fi
}


for S in "first" "second" "third"; do
    append_queue "$S"
done

while (( BEGIN != END )); do
    remove_queue
    echo "$X"
done
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: bash сортировка кольцевая

Сообщение drBatty »

yoricI писал(а):
19.03.2014 11:05
НО в чистом виде LILO невозможен, так как недостоверные таймстампы, вот против этого и нужна сортировка.

при чём тут ваще ваши таймстампы???

вот вам до кучи сортированный список:

Код: Выделить всё

#!/bin/bash

declare -a QUEUE

X=
COUNT=0

append_queue()
{
    INDEX="$1"
    while [ "$INDEX" != "${INDEX#0}" ]; do
        INDEX="${INDEX#0}"
    done
    QUEUE[$INDEX]=$COUNT
    (( COUNT++ ))
}


for S in "1" "2" "007" "3" "000028"; do
    append_queue "$S"
done

for X in "${!QUEUE[@]}"; do
    echo "$X COUNT=${QUEUE[$X]}"
done

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
yoricI
Сообщения: 2345
ОС: gentoo fluxbox

Re: bash сортировка кольцевая

Сообщение yoricI »

drBatty писал(а):
19.03.2014 12:04
какой нафиг "lilo"??? LIFO!

-001->...007->068...->564...->999-
^___________________________________|
LILO, или кольцо получается. Только вот дополняя первое сообщение, могу сказать, этим файликам делается "mv" в место обработки, потом они появляются вновь. В каталоге может быть или только один файл (последний, ожидающий записи), или до нескольких предыдущих вкупе с этим последним, если за цикл проверки=1минуту успели посоздаваться требующие дальнейшей обработки.

(drBatty) писал(а):при чём тут ваще ваши таймстампы???

Первый (или последний) [вошёл (или вышел)] - подразумевает время. Это ведь действительно не стек в процессоре, где доступ только через вершину (ну или через подкоп:-) Тут можно и сбоку вытащить

Кстати, осенила тут мысль, что придуманный мной LILO по сути тот же FIFO. Или есть различие? Формально-то есть, а вот на деле.... Пошёл пробовать FIFO
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: bash сортировка кольцевая

Сообщение Hephaestus »

yoricI писал(а):
18.03.2014 20:25
Подскажите пож-ста, как организовать кольцевую сортировку. Суть такова - в каталоге создаются файлики 001....999, которые надо обрабатывать по порядку, даже не обязательно по порядку, но не затрагивая последнего, в который пишутся данные. А могут и не писаться, режим ожидания, но файлик уже существует.
Э-э-э... Может я чего не понял...
Но почему нельзя этот последний файлик положить в отдельный каталог (находящийся здесь же) и писать туда результаты, а остальные файлы обрабатывать так, как хочется?
Тогда результирующий затронут не будет и сортировка не понадобится.

Ещё вариант: дать результирующему файлу имя, отличное от [0-9][0-9][0-9]. и обрабатывать файлы по маске.
Но с отдельным каталогом, по-моему проще.

Не подойдет?
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
yoricI
Сообщения: 2345
ОС: gentoo fluxbox

Re: bash сортировка кольцевая

Сообщение yoricI »

С FIFO не получилось

("fflatx") писал(а):Может я чего не понял...

Или я плохо объяснил))
Положить можно хоть куда, но следующие будут там же. Программа (sox) пишет звук, по тишине завершает файл и открывает новый, с возросшим номером-именем. И так до 999, потом снова 001. Вот я и хотел переносить старые отработанные записанные файлы в другое место и "делай с ними что хошь". Не думал, что такая проблема выплывет, придётся перезапускать программу, можно потерять некоторое время записи. И имя другое не дашь, в демоническом режиме sox именует файлы по порядку % - 001-999. Так что увы
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: bash сортировка кольцевая

Сообщение Hephaestus »

yoricI писал(а):
20.03.2014 17:02
Вот я и хотел переносить старые отработанные записанные файлы в другое место и "делай с ними что хошь".
Можно определять, какой файл занят sox'ом и переносить все, кроме него.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
yoricI
Сообщения: 2345
ОС: gentoo fluxbox

Re: bash сортировка кольцевая

Сообщение yoricI »

Неплохая идея. Формируем список файлов, по одному, проверяем на занятость, свободен - на выход. Попробую оформить.

Очередь тяжёлых заданий на BASH для общего развития

if [ `fuser /dev/snd/pcmC0Dp > /dev/null 2>&1; echo $?` != 0 ]; then echo 'файл свободен'; else echo 'файл занят'; fi

работает
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: bash сортировка кольцевая

Сообщение drBatty »

yoricI писал(а):
20.03.2014 19:46
Очередь тяжёлых заданий на BASH для общего развития

развивайтесь самостоятельно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить