Приветствую!
Есть задачка.Необходимо отсортировать список каталогов, имя каталога имеет вид: 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в такой последовательности.
Если есть какие-нибудь идеи жду с нетерпением.
>
>Нужно чтобы список был отсортирован с учетом минуса, т.е:
>
а что это значит "с учетом минуса"?
man sort
>
>>
>>Нужно чтобы список был отсортирован с учетом минуса, т.е:
>>
>а что это значит "с учетом минуса"?
>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
ну, вот так можно (предполагая, что у каталогов первые две буквы, потом дата):ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\ -f2
>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>дата):
>
>ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\ -f2
>может быть первыми и три буквы, но не больше!
>>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>>дата):
>>
>>ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\ -f2
>>
>
>может быть первыми и три буквы, но не больше!Не возражаю ;)
>>>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>>>дата):
>>>
>>>ls | sed 'h;s/^\(..[0-9]\{6\}\)\.\([0-9]\{2\}\)/\1-0.\2/;G;s/\n/ /' | sort | cut -d\ -f2
>>>
>>
>>может быть первыми и три буквы, но не больше!
>
>Не возражаю ;)ls | sort -t - +1
>>>>ну, вот так можно (предполагая, что у каталогов первые две буквы, потом
>>>>дата):
>>>>
>>>>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
donefor i in $DPA;do
echo $i | awk -Fdpa '{print $2}' | awk -F"." '{print $1}'>> $tmpfile=`cat $tmp |sort |tee $tmp1`
done
}Результат:
060626
060626-1
060703
060703-1
060704
060704
060704-1который обрабатывается далее в нужном направлении...
Посмотрите как отработает, я уверен, что данную функцию можно написать в одну строчку.
Пока только начинаю разбираться в регульрных выражениях, так что не судите строго :)
>... уверен, что данную функцию можно написать в одну строчку.
ls | cut -d. -f1 | sort
>ls | sort -t - +1ого!
а что значит +1 ? в мане не нашел...
>
>>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.
>>
>>>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 | 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
>Вот как вышел из ситуации:
>
>ls -1 -A | perl -wne 's/[a-p]//g' |sort -t. +0 -1Еще вместо перла задействовать AWK - и будет достаточно оптимально.
>>Вот как вышел из ситуации:
>>
>>ls -1 -A | perl -wne 's/[a-p]//g' |sort -t. +0 -1
>
>Еще вместо перла задействовать AWK - и будет достаточно оптимально.
А как это реализовать на AWK?
>А как это реализовать на 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.