Сортировка с помощью утилиты sort элементов в строке.
Предположим мы имеем строку:
str="item4, item2, item3, item2, ..."
и хотим отсортировать ее элементы без повторений в shell-скрипте.
Для сортировки без повторений логично воспользоваться sort -u
. Итак мы должны преобразовать строку, разделенную запятыми, в многострочную, отсортировать и вернуть обратно исходное форматирование.
В блоге одного приятного человека описан вариант с использованием мощной утилиты sed
, которую я стараюсь избегать из за необходимости перечитывать много документации по sed
долго отлаживать код. Вот одно из предлагаемых решений:
echo "item4, item2, item3, item2, ..." \
| sed "s| *, *|\n|g" \
| grep -v "^ *$" \
| sort --unique \
| sed -e ':x;$by;N;bx' -e ':y;s/\n/, /g'
Я попытался использовать утилиту awk
. Я думаю следующий скрипт выглядит нагляднее и в принципе его можно набрать с первого раза и даже правильно (ну если помнить о RS
и ORS
):
echo "item4, item2, item3, item2, ..." \
| tr -d " \n" \
| awk 'BEGIN{RS=",";ORS="\n"}{print $0}' \
| sort -u \
| awk '{ORS=", "}{print $1}'
1 comments:
$ PAGER=cat man awk | wc -l
1612
$ PAGER=cat man sed | wc -l
256
так что документации у sed намного меньше :)) Но это я так, хулиганю немного. Конечно же awk более нагляден, хотя мне симпатичнее perl для такой задачи, если выбирать тяжёлую артиллерию.
Отправить комментарий