Строки 1,2,3,4, …, n-1, n к строкам n, n-1, …, 4,3,2,1

Это не может быть тем, что Вы ожидаете, ни был то, если для меня, но это работает (никакая требуемая мышь)... (btw: я только что начал использовать Терминатора, и до сих пор мне нравится он)..

Способ сделать это состоит в том, чтобы просто сделать это:

  • Если Ваш активный курсор уже находится в поле Find, просто продолжайте нажимать Enter для Следующего.... и для Предыдущего, нажать Tab сделать Prev button активный затем просто продолжают нажимать Enter... Prev button остается активен, таким образом, это располагается назад каждый раз, когда Вы нажимаете Enter..
  • Если Ваш текущий активный курсор в в теле окна, просто нажмите Ctrl+Shift+F снова, для возвращения Вас в поле Find, то просто нажимают Enter (затем) или Вкладку, то Войдите (предыдущий)..

Кроме того, можно переключиться между кнопками, для инвертирования поискового направления, через Левый и правый курсор (стрелка) ключи (я нахожу это легче, чем Shift-Tab)...

2
13.04.2017, 15:36
4 ответа

Для Вашей конкретной проблемы это не самый эффективный способ пойти об этом, однако, можно использовать любое из следующих для печати файла со строками в обратном порядке с различными степенями мобильности (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.

4
27.01.2020, 21:49
  • 1
    Ваш awk острота printf перестанет работать, если вход будет содержать знак %. Лучше используйте отдельную строку формата: printf "%s",i. –  manatwork 19.09.2011, 10:56
  • 2
    @manatwork, зафиксированная. –  Chris Down 19.09.2011, 16:04
  • 3
    Бросая другой взгляд на Ваши альтернативы кода, те конкатенации в awk и 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:38
  • 4
    @manatwork - Спасибо за awk предложение массива, которое было исходным, которое я отправил, но я забыл сравнивать эффективность этих двух методов. Что касается жемчуга, там любая причина не просто сделать perl -e 'print reverse<>'? Это, кажется, немного менее дорого. –  Chris Down 19.09.2011, 16:46
  • 5
    Никакая причина за исключением моего отсутствия знаний. –  manatwork 19.09.2011, 16:49

tac (cat назад, и включенный в coreutils также), будет cat файл в обратном порядке:

$ cat /tmp/test
One
Two
Three

$ tac /tmp/test
Three
Two
One

(В случае конкретной проблемы Вы упомянули решения, там лучше, чем инвертирование всего файла именно так, можно добавить файл и инвертировать целый файл снова),

5
27.01.2020, 21:49
  • 1
    продолжается и уточняет последнюю точку. Я не уверен, к чему Вы действительно стремитесь. Разве это не зависит от файловой системы так на данных stuctures и как это сохранило файлы, насколько хороший некоторый метод действительно? Предположим, что строки соединены со связанным списком, который формирует торус, таким образом, он требует только, чтобы постоянное время инвертировало файл (а именно, для чтения назад). Но уверенный, если соединения строки сделаны по-другому, может требоваться больше операции в секунду, не только постоянное время и тот путь "лучше" - но и я не вижу этот метод, хуже, чем другие методы, не зная файловую систему и как соединены строки. –   18.09.2011, 19:37
  • 2
    @hhh, Если бы строки были действительно соединены в круговом связанном списке, затем вставляющем один в конце, был бы O (1), но я вполне уверен, никакая файловая система в мире никогда не делала это. Скорее всего, Ваши файлы просто хранятся на диске линейно; файловые системы не имеют понятия "строк" в файле –  Michael Mrozek♦ 18.09.2011, 19:49
  • 3
    @hhh, Все системы Unix хранят текстовые файлы как плоскую последовательность символов с символом LF (\n) маркировка конца каждой строки. Существует несколько Ose, которые хранят файлы как массивы записей (строки), но даже если необходимо было получить доступ к таким файлам от Unix, нет никакого API для чтения их кроме байта байтом. –  Gilles 'SO- stop being evil' 18.09.2011, 20:41

tac утилита инвертирует строки. Это cat наоборот.

2
27.01.2020, 21:49

Утилиты GNU (Linux, Cygwin) и BusyBox имеют tac команда, которая инвертирует порядок строк в текстовом файле.

В системах, которые не имеют tac, можно работать он от стандартных команд. Ответ Chris Down показывает несколько способов сделать это, храня файл полностью в памяти. Для очень большого файла путь, который будет работать, не перегружаясь над большинством нельдов, состоит в том, чтобы сделать sort сделайте реверсирование. Это не столь эффективно для файлов среднего размера, но реализации вида могут обычно справляться с файлами, которые больше, чем доступная память.

nl | sort -nr | sed 's/.*\t//'

(Замена \t литеральным символом табуляции.)

Как уже отмечено Michael Mrozek, инвертирование строк является плохим способом предварительно ожидать данные в файл. Метод трудно понять и выполняет большую дополнительную работу.

1
27.01.2020, 21:49
  • 1
    sort -n должен быть sort -rn инвертировать результат сравнений. –  Chris Down 18.09.2011, 21:02

Теги

Похожие вопросы