Загрузка языка более высокого уровня требует времени.
Для нескольких строк сама оболочка может быть решением.
Мы можем использовать внешнюю команду sort
и команду tr
. Один достаточно эффективен для сортировки строк, а другой эффективен для преобразования одного разделителя в символы новой строки :
#!/bin/bash
shsort(){
while IFS='' read -r line; do
echo "$line" | tr "$1" '\n' |
sort -n | paste -sd "$1" -
done <<<"$2"
}
shsort ' ' '10 50 23 42'
shsort '.' '10.1.200.42'
shsort ',' '1,100,330,42'
shsort '|' '400|500|404'
shsort ',' '3 b,2 x,45 f,*,8jk'
shsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
Это необходимо bash из-за использования только <<<
. Если его заменить документом -, решение подходит для posix.
Это позволяет сортировать поля с помощью табуляции, пробелов или символов оболочки (*
, ?
, [
). Не новые строки, потому что каждая строка сортируется.
Измените <<<"$2"
на <"$2"
, чтобы обрабатывать имена файлов и называть их как:
shsort '.' infile
Разделитель одинаков для всего файла. Если это ограничение, его можно улучшить.
Однако файл, содержащий всего 6000 строк, обрабатывается 15 секунд. Действительно, оболочка — не лучший инструмент для обработки файлов.
Для более чем нескольких строк (более нескольких десятков )лучше использовать настоящий язык программирования. Решение awk может быть:
#!/bin/bash
awksort(){
gawk -v del="$1" '{
split($0, fields, del)
l=asort(fields)
for(i=1;i<=l;i++){
printf( "%s%s", (i==0)?"":del, fields[i] )
}
printf "\n"
}' <"$2"
}
awksort '.' infile
Что занимает всего 0,2 секунды для того же файла из 6000 строк, упомянутого выше.
Поймите, что <"$2"
для файлов может быть изменен обратно на <<<"$2"
для строк внутри переменных оболочки.
Самое быстрое решение — perl.
#!/bin/bash
perlsort(){ perl -lp -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' <<<"$2"; }
perlsort ' ' '10 50 23 42'
perlsort '.' '10.1.200.42'
perlsort ',' '1,100,330,42'
perlsort '|' '400|500|404'
perlsort ',' '3 b,2 x,45 f,*,8jk'
perlsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
Если вы хотите отсортировать файл, измените <<<"$a"
на просто "$a"
и добавьте -i
в параметры Perl, чтобы сделать редактирование файла «на месте»:
#!/bin/bash
perlsort(){ perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }
perlsort '.' infile; exit
Я получил доступ к логам journald
и выяснил следующее.
Интересно, что служба не запустится, если диск заполнен.
Марионетка во время работы может выбрать запуск
yum clean all
Что устраняет проблему и позволяет запустить службу.