2010-08-06

Сортировка с помощью утилиты 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:

Beggy комментирует...

$ PAGER=cat man awk | wc -l
1612
$ PAGER=cat man sed | wc -l
256

так что документации у sed намного меньше :)) Но это я так, хулиганю немного. Конечно же awk более нагляден, хотя мне симпатичнее perl для такой задачи, если выбирать тяжёлую артиллерию.