Сортировка строк от самых длинных до кратчайших

Как я могу переставить все строки в файле от самого длинного до кратчайшего? Например, например:

elephant
zoo
penguin

Будет изменено на

elephant
penguin
zoo

Ответы

Ответ 1

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

awk '{ print length($0) " " $0; }' $file | sort -r -n | cut -d ' ' -f 2-

Ответ 2

TIM (моя краткая версия для TIMTOWTDI... хмм, но теперь это уже давно: (

perl -ne '@a = <>; print sort { length $b <=> length $a } @a' file

позволяет зарезервировать reverse и push при необходимости

и мне интересно, сколько времени потребуется на этот файл 550 МБ

Ответ 3

С POSIX Awk:

{
  c = length
  m[c] = m[c] ? m[c] RS $0 : $0
} END {
  for (c in m) q[++x] = m[c]
  while (x) print q[x--]
}

Пример

Ответ 4

Perl версия с кончиком шляпы до @thiton:

perl -ne 'print length($_)." $_"' file | sort -r -n | cut -d ' ' -f 2-

$_ - текущая строка, аналогичная awk $0

perl-5.24 исполнение в файле размером 550 МБ с 6 миллионами строк (British National Corpus) заняло 24 секунды


Выполнение

@thiton awk (3.1.7) заняло 26 секунд


С кончиком шляпы @William Pursell из связанного сообщения:

perl -ne 'push @a, $_; END{ print reverse sort { length $a <=> length $b } @a }' file

Выполнение perl-5.24 заняло 12,0 секунд