2

Учитывая файл, который выглядит как:

Crab
  some text that doesn't need sorting.
  more textual descriptination
Albatross
  some text or other
  perhaps a list that needs no sorting:
    1. a
    2. bee
Dolphin
Pterodactyl
  long story about this particular animal.

Как бы я сказал Vim (версия 7) отсортировать этот файл в алфавитном порядке по имени животного? Невозможно? Как еще можно отсортировать этот файл?

2 ответа2

6

Да, вы можете сделать это в VIM:

:%s/$/$/
:g/^\w/s/^/\r/
:1del t | $put t
:g/^\w/,/^$/-1join!
:sort
:%s/\$/\r/g
:g/^$/d

выход

Albatross
  some text or other
  perhaps a list that needs no sorting:
    1. a
    2. bee
Crab
  some text that doesn't need sorting.
  more textual descriptination
Dolphin
Pterodactyl
  long story about this particular animal.

Вы должны использовать специальный символ для обозначения EOL(кроме $)!

3

Как еще можно отсортировать этот файл?

$perl sortparagraphs animals.txt

Albatross
  some text or other
  perhaps a list that needs no sorting:
    1. a
    2. bee
Crab
  some text that doesn't need sorting.
  more textual descriptination
Dolphin
Pterodactyl
  long story about this particular animal.

Где сортировка

#!/usr/local/bin/perl
use strict;
use warnings;

my ($paragraph, @list);
while(<>) {
  if (/^\S/) {
    push @list, $paragraph if $paragraph;
    $paragraph = '';
  }
  $paragraph .= $_;
}
push @list, $paragraph if $paragraph;
print sort @list;

Вероятно, существует лучшее решение Perl, но приведенный выше ответ является быстрым.

Если файл больше памяти, может быть целесообразно преобразовать файл в строку для каждого животного, отсортировать и, наконец, преобразовать обратно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .