Если это просто операция вы хотите сделать на своем собственном (а не компонента вы хотите использовать), наиболее практичным способом для меня было бы сделать что-то вроде этого:
sort <filename> | uniq -c | sed 's/^[ \t]*//' | sort -rn
Из Конечно, он не очень хорошо масштабируется по сравнению с линейным алгоритмом, но он работает достаточно хорошо для повседневных задач, и у него есть дополнительное преимущество, которое вам не нужно изобретать вручную.
EDIT: вроде»сортирует файл,„Уник“группы всех последовательных линий, которые одинаковы в пару [частота] [пункт] пары, например
12
12
24
25
25
25
становится
2 12
1 24
3 25
Затем я удаляю конечное пространство с помощью «sed» (если это не работает, это потому, что иногда возникает проблема с тем, как символ табуляции находится в putted), то я сортирую вывод по частоте (опция «n» запрашивает числовую сортировку вместо лексикографической; опция «r» запрашивает обратную сортировку).
Если вы хотите выбрать другое поле для сортировки (скажем, потому что число, на которое вы действительно заинтересованы в подсчете частоты, является полем THIRD строки с разделителями табуляции), вы можете использовать функцию выбора «сортировка» :
sort -t'\t' -k3 <filename> | ...
Это говорит о том, что ваш вход табуляцией список полей, и что вы хотите отсортировать по третьему полю.
EDIT 2: здесь есть линия, чтобы сделать это в соответствии с четвертым полем (и удалить все другие поля)
cut -d'\t' -f4 <filename> | sort | uniq -c | sed 's/^[ \t]*//' | sort -rn
Я смущен, что цифры в вашем файле. Являются ли они числами, и вы пытаетесь подсчитать, сколько раз эти цифры появляются, чтобы рассчитать частоту? Кроме того, вы ищете только наиболее распространенное число? Потому что вы, скорее всего, делаете это намного эффективнее, чем сортированный список частот. – laurenelizabeth