Как найти количество неупорядоченных пар из списка

Я хочу подсчитать количество неупорядоченных пар из списка.

Другими словами, у меня есть список:

ab ba ac bc 

и я хочу отобразить:

 2 ab 1 ac 1 bc 

4 Solutions collect form web for “Как найти количество неупорядоченных пар из списка”

Это звучит неплохо для perl :

 perl -F -lane '$count{join "", sort @F}++; END{print "$count{$_} $_" for sort keys %count}' < your-file 

С gawk :

 gawk -F '' '{ print ($1 > $2) ? $2$1 : $1$2 }' | sort | uniq -c 

Каждое поле соответствует одному символу ( -F '' ). Мы просто инвертируем символы, если первая больше второй в соответствии с текущей локалью (что не имеет значения). Затем мы сортируем результат и подсчитываем одинаковые последовательные строки с uniq -c .

Вот общий способ с последними версиями GNU awk:

 gawk -i join ' { split($0, F, //) asort(F) h[join(F, 1, length(F), SUBSEP)]++ } END { asorti(h, x) for(k in h) print h[k], k }' infile 

Или как отдельный скрипт:

order.awk

 @include "join" { split($0, F, //) asort(F) h[join(F, 1, length(F), SUBSEP)]++ } END { asorti(h, x) for(k in h) print h[k], k } 

Выполните его следующим образом:

 gawk -f order.awk infile 

Вывод:

 2 ab 1 ac 1 bc 

fish раковина:

 ⋊> ~ echo 'ab ba ac bc' | while read line; echo -n "$line" | sed -r 's|(.)|\1\n|g' | sort | xargs | tr --delete ' '; end | uniq -c 

оболочка bash :

 bash-3.2$ echo 'ab ba ac bc' | while read line; do echo -n "$line" | sed -r 's|(.)|\1\n|g' | sort | xargs | tr --delete ' '; done | uniq -c 

Вывод:

  2 ab 1 ac 1 bc 
  • Найти дубликаты по столбцу в файле
  • Удаление строк с одним общим полем
  • Почему утилита uniq дает мне неожиданные результаты?
  • Отображение имен файлов с помощью grep
  • Почему uniq игнорирует Unicode и строки с одной буквой?
  • суммы столбцов на основе совпадающих полей
  • Получение размера родительских папок при использовании поиска для поиска критериев?
  • Где исчезла моя строка `uniq` или` sort -u`, с некоторыми символами юникода
  • Попытка сортировать два списка чисел и использовать uniq для получения пересечения
  • uniq показывает повторяющиеся строки
  • `uniq` не в режиме реального времени, когда
  • Linux и Unix - лучшая ОС в мире.