URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5971
[ Назад ]

Исходное сообщение
"сортировка "

Отправлено Peter , 29-Ноя-06 14:51 
Приветствую!
Есть задачка.

Необходимо отсортировать список каталогов, имя каталога имеет вид: xxyymmdd.dd и xxxyymmdd.dd, например

1. aa060212.12
2. aa060212-1.12
3. aa060212-4.12
4. ccc060512-1.12
5. ccc060611.12

Нужно чтобы  список был отсортирован с учетом минуса, т.е:

xxxx.12
xxxx-1.12
xxxx-2.12

в такой последовательности.

Если есть какие-нибудь идеи жду с нетерпением.


Содержание

Сообщения в этом обсуждении
"сортировка "
Отправлено madskull , 29-Ноя-06 15:05 

>
>Нужно чтобы  список был отсортирован с учетом минуса, т.е:
>
а что это значит "с учетом минуса"?
man sort

"сортировка "
Отправлено Peter , 29-Ноя-06 16:24 
>
>>
>>Нужно чтобы  список был отсортирован с учетом минуса, т.е:
>>
>а что это значит "с учетом минуса"?
>man sort

Проблема в том, что сорт не отслеживает окончание названия, т.е не совсем верно формирует список. Приведу пример, он лучше покажет:

есть каталоги, в консоли отсортированы по дате создания:

aa120612.12
aa120612-2.12
aa120612-3.12
aa120612-1.12

после обработки sort

получим:

aa120612-1.12
aa120612-2.12
aa120612-3.12
aa120612.12

Это не правильно, нужно чтобы "-1" и т.д. шли в порядке убывания, с учетом названия без "-1" и т.п:

aa120612.12
aa120612-1.12
aa120612-2.12
aa120612-3.12


"сортировка "
Отправлено madskull , 29-Ноя-06 16:37 
ну, вот так можно (предполагая, что у каталогов первые две буквы, потом дата):

ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\  -f2


"сортировка "
Отправлено Peter , 29-Ноя-06 18:10 
>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>дата):
>
>ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\  -f2
>

может быть первыми и три буквы, но не больше!


"сортировка "
Отправлено madskull , 29-Ноя-06 22:06 
>>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>>дата):
>>
>>ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\  -f2
>>
>
>может быть первыми и три буквы, но не больше!

Не возражаю ;)


"сортировка "
Отправлено DeadLoco , 30-Ноя-06 15:21 
>>>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>>>дата):
>>>
>>>ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\  -f2
>>>
>>
>>может быть первыми и три буквы, но не больше!
>
>Не возражаю ;)

ls | sort -t - +1


"сортировка "
Отправлено Peter , 01-Дек-06 10:30 
>>>>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>>>>дата):
>>>>
>>>>ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\  -f2
>>>>
>>>
>>>может быть первыми и три буквы, но не больше!
>>
>>Не возражаю ;)
>
>ls | sort -t - +1

Спасибо, ни один совет не помог, возможно меня не совсем поняли.
Вот мое, профанское, решение, будут рад критике:
sort(){
DP=`ls -1 -A $DISP |grep -v dpa`
DPA=`ls -1 -A $DISP |grep ^dpa`

tmp=./sort.tmp
tmp1=./sorted.tmp


for i in $DP;do
    echo $i | awk -Fdp '{print $2}'| awk -F"." '{print $1}' >> $tmp
done

for i in $DPA;do
    echo $i | awk -Fdpa '{print $2}' | awk -F"." '{print $1}'>> $tmp

file=`cat $tmp |sort |tee $tmp1`

done
}

Результат:

060626
060626-1
060703
060703-1
060704
060704
060704-1

который обрабатывается далее в нужном направлении...

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


"сортировка"
Отправлено vt , 01-Дек-06 15:48 
>... уверен, что данную функцию можно написать в одну строчку.
ls | cut -d. -f1 | sort

"сортировка "
Отправлено madskull , 01-Дек-06 14:10 

>ls | sort -t - +1

ого!
а что значит +1 ? в мане не нашел...


"сортировка "
Отправлено DeadLoco , 01-Дек-06 16:26 
>
>>ls | sort -t - +1
>
>ого!
>а что значит +1 ? в мане не нашел...


  +POS1 [-POS2]
              Specify  a  field within each line to use as a sorting key.  The
              field consists of the portion of the line starting at  POS1  and
              up  to  (but  not  including) POS2 (or to the end of the line if
              POS2 is not given).  The fields and character positions are num-
              bered starting with 0.


"сортировка "
Отправлено madskull , 01-Дек-06 17:30 
>>
>>>ls | sort -t - +1
>>
>>ого!
>>а что значит +1 ? в мане не нашел...
>
>
>  +POS1 [-POS2]
>            
>  Specify  a  field within each line to
>use as a sorting key.  The
>            
>  field consists of the portion of the line starting
>at  POS1  and
>            
>  up  to  (but  not  including)
>POS2 (or to the end of the line if
>            
>  POS2 is not given).  The fields and character
>positions are num-
>            
>  bered starting with 0.

Прикольно, у меня такого нет, хотя, вроде, работает.
$ sort --version
sort (GNU coreutils) 6.6


"сортировка "
Отправлено Peter , 04-Дек-06 09:36 
>>>
>>>>ls | sort -t - +1
>>>
>>>ого!
>>>а что значит +1 ? в мане не нашел...
>>
>>
>>  +POS1 [-POS2]
>>            
>>  Specify  a  field within each line to
>>use as a sorting key.  The
>>            
>>  field consists of the portion of the line starting
>>at  POS1  and
>>            
>>  up  to  (but  not  including)
>>POS2 (or to the end of the line if
>>            
>>  POS2 is not given).  The fields and character
>>positions are num-
>>    


>>  bered starting with 0.
>
>Прикольно, у меня такого нет, хотя, вроде, работает.
>$ sort --version
>sort (GNU coreutils) 6.6


Вот как вышел из ситуации:

ls -1 -A | perl -wne 's/[a-p]//g' |sort -t. +0 -1


"сортировка "
Отправлено DeadLoco , 04-Дек-06 12:13 
>Вот как вышел из ситуации:
>
>ls -1 -A | perl -wne 's/[a-p]//g' |sort -t. +0 -1

Еще вместо перла задействовать AWK - и будет достаточно оптимально.


"сортировка "
Отправлено Greg , 05-Дек-06 23:35 
>>Вот как вышел из ситуации:
>>
>>ls -1 -A | perl -wne 's/[a-p]//g' |sort -t. +0 -1
>
>Еще вместо перла задействовать AWK - и будет достаточно оптимально.


А как это реализовать на AWK?


"сортировка "
Отправлено DeadLoco , 06-Дек-06 04:09 
>А как это реализовать на AWK?
gsub(r,s,t)
Globally substitutes s for each match of the regular expression r in the string t. Returns the number of substitutions. If t is not supplied, defaults to $0.