Сортировка файлов по частоте «содержание строки» - печать дубликатов

874
GeekyGeek

Представь, что есть файл -

a b b b b c c d d d 

Я хочу, чтобы выходные данные были отсортированы по частоте (я хочу, чтобы дублирующиеся строки также печатались), а также -

b b b b d d d c c a 
-1

2 ответа на вопрос

3
Attie

Следующее сделает то, что вам нужно ... хотя есть много других способов добиться этого ... например, с gawkпомощью ответа Камиля.

  • Первый sortупорядочит данные по строковым данным
  • uniq -c будет подсчитывать количество совпадений (они должны быть соседями)
  • sort -nr отсортировать по количеству вхождений в обратном порядке
  • В whileитерации цикла по каждой строке
    • read n lбудет принимать в счетчик n, а данные строки вl
  • forЦикл будет повторять nраз
  • echo "$" выводит данные строки
( sort \ | uniq -c \ | sort -nr \ | while read n l; do \ for i in $(seq $); do \ echo "$"; \ done; \ done ) <<"EOF" a b b b b c c d d d EOF 
3
Kamil Maciorowski

С GNU Awk:

gawk ' { arr[$0]++ } END { PROCINFO["sorted_in"] = "@val_num_desc" for (ln in arr) for (i = 1; i <= arr[ln]; i++) print ln } ' 

Хитрость заключается в том, чтобы использовать массив и @val_num_desc. Каждая встреченная строка становится индексом, соответствующее значение увеличивается каждый раз, когда появляется строка. В конце мы сканируем весь массив в определенном порядке:

"@val_num_desc"
[…] Значения элементов, рассматриваемые как числа, упорядочены от высокого к низкому.

источник

Таким образом, внешний (первый) forотвечает за извлечение строк и их частоты в нужном порядке; внутренняя (вторая) forпросто печатает выбранную строку нужное количество раз.

Замечания:

  • Каждый персонаж имеет значение. Строка и та же строка с дополнительным пробелом различаются.
`PROCINFO [" sorted_in "]` - здорово, именно то, что я искал, чтобы сделать пример с `awk`, спасибо! Attie 5 лет назад 0
@ Atttie Я думаю, что это может не сработать простым `awk`, если только ваш` awk` не «замаскированный». В моем Debian `awk` был слишком ограниченным, я должен был установить` gawk`. Теперь обе команды понимают это, потому что `awk` (не напрямую) является символической ссылкой на` gawk`. Kamil Maciorowski 5 лет назад 3

Похожие вопросы