Ответ 1
Добавить длину строки в качестве первого поля строки, сортировать и удалить длину строки:
awk '{ print length($0) " " $0; }' $file | sort -r -n | cut -d ' ' -f 2-
Как я могу переставить все строки в файле от самого длинного до кратчайшего? Например, например:
elephant
zoo
penguin
Будет изменено на
elephant
penguin
zoo
Добавить длину строки в качестве первого поля строки, сортировать и удалить длину строки:
awk '{ print length($0) " " $0; }' $file | sort -r -n | cut -d ' ' -f 2-
TIM (моя краткая версия для TIMTOWTDI... хмм, но теперь это уже давно: (
perl -ne '@a = <>; print sort { length $b <=> length $a } @a' file
позволяет зарезервировать reverse
и push
при необходимости
и мне интересно, сколько времени потребуется на этот файл 550 МБ
С 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--]
}
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 секунд