Это не может быть тем, что Вы ожидаете, ни был то, если для меня, но это работает (никакая требуемая мышь)... (btw: я только что начал использовать Терминатора, и до сих пор мне нравится он)..
Способ сделать это состоит в том, чтобы просто сделать это:
Enter
для Следующего.... и для Предыдущего, нажать Tab
сделать Prev button
активный затем просто продолжают нажимать Enter
... Prev button
остается активен, таким образом, это располагается назад каждый раз, когда Вы нажимаете Enter.. Кроме того, можно переключиться между кнопками, для инвертирования поискового направления, через Левый и правый курсор (стрелка) ключи (я нахожу это легче, чем Shift-Tab)...
Для Вашей конкретной проблемы это не самый эффективный способ пойти об этом, однако, можно использовать любое из следующих для печати файла со строками в обратном порядке с различными степенями мобильности (tac
например, не включен по умолчанию на многих Unixes):
sed '1!G;h;$!d' [file]
awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' [file]
perl -e 'print reverse<>' [file]
tac [file]
В моей системе самое быстрое tac
, как протестировано следующим:
$ printf '%s\n' {a..z}{a..z}{a..z} > foo
$ time sed '1!G;h;$!d' foo > /dev/null 2>&1
real 0m0.582s
user 0m0.544s
sys 0m0.012s
$ time awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' foo > /dev/null 2>&1
real 0m0.060s
user 0m0.052s
sys 0m0.008s
$ time perl -e 'print reverse<>' foo > /dev/null 2>&1
real 0m0.021s
user 0m0.016s
sys 0m0.004s
$ time tac foo > /dev/null 2>&1
real 0m0.003s
user 0m0.004s
sys 0m0.000s
... таким образом, если Вы имеете tac
, используйте его, но иначе, используйте perl
или awk
.
tac
(cat
назад, и включенный в coreutils
также), будет cat
файл в обратном порядке:
$ cat /tmp/test
One
Two
Three
$ tac /tmp/test
Three
Two
One
(В случае конкретной проблемы Вы упомянули решения, там лучше, чем инвертирование всего файла именно так, можно добавить файл и инвертировать целый файл снова),
\n
) маркировка конца каждой строки. Существует несколько Ose, которые хранят файлы как массивы записей (строки), но даже если необходимо было получить доступ к таким файлам от Unix, нет никакого API для чтения их кроме байта байтом.
– Gilles 'SO- stop being evil'
18.09.2011, 20:41
Утилиты GNU (Linux, Cygwin) и BusyBox имеют tac
команда, которая инвертирует порядок строк в текстовом файле.
В системах, которые не имеют tac
, можно работать он от стандартных команд. Ответ Chris Down показывает несколько способов сделать это, храня файл полностью в памяти. Для очень большого файла путь, который будет работать, не перегружаясь над большинством нельдов, состоит в том, чтобы сделать sort
сделайте реверсирование. Это не столь эффективно для файлов среднего размера, но реализации вида могут обычно справляться с файлами, которые больше, чем доступная память.
nl | sort -nr | sed 's/.*\t//'
(Замена \t
литеральным символом табуляции.)
Как уже отмечено Michael Mrozek, инвертирование строк является плохим способом предварительно ожидать данные в файл. Метод трудно понять и выполняет большую дополнительную работу.
awk
остротаprintf
перестанет работать, если вход будет содержать знак %. Лучше используйте отдельную строку формата:printf "%s",i
. – manatwork 19.09.2011, 10:56awk
иperl
замедляют Ваши решения. Я предлагаю изменить Вашу стратегию и сэкономить конкатенации при помощи массивов:awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' foo
иperl -ne 'push@f,$_;END{print reverse@f}' foo
. – manatwork 19.09.2011, 16:38awk
предложение массива, которое было исходным, которое я отправил, но я забыл сравнивать эффективность этих двух методов. Что касается жемчуга, там любая причина не просто сделатьperl -e 'print reverse<>'
? Это, кажется, немного менее дорого. – Chris Down 19.09.2011, 16:46