Я хотел бы изменить порядок строк в текстовом файле (или стандартный ввод), сохранив содержимое каждой строки.
Итак, т.е. начиная с:
foo
bar
baz
Я хотел бы закончить с
baz
bar
foo
Для этого есть стандартная утилита командной строки UNIX?
shell
unix
command-line
Скотти Аллен
источник
источник
perl -e 'print reverse <>'
но, вероятно, это применимо и к другим методам).Ответы:
Хвост BSD:
Ссылка: страницы руководства FreeBSD , NetBSD , OpenBSD и OS X.
источник
Также стоит упомянуть:
tac
(Гм, реверсcat
). Часть coreutils .Перевернуть один файл в другой
источник
brew install coreutils
(устанавливаетсяgtac
по умолчанию).echo -n "abc\ndee" > test; tac test
,Есть известные уловки sed :
(Пояснение: добавьте не начальную строку для хранения буфера, измените строку и сохраните буфер, распечатайте строку в конце)
В качестве альтернативы (с более быстрым выполнением) из однострочников awk :
Если ты не можешь вспомнить это,
В системе с утилитами GNU другие ответы проще, но не во всем мире GNU / Linux ...
источник
tail -r
и TAC.tac
ожидается, что он будет обрабатывать произвольные большие файлы, которые не помещаются в памяти (хотя длина строки все еще ограничена). Неясно,sed
работает ли решение для таких файлов.в конце вашей команды поставьте:
| tac
tac делает именно то, что вы просите, он записывает каждый ФАЙЛ в стандартный вывод, в последнюю строку первым.
Так это противоположность кошки :-).
источник
tac
команды, это полезно для новых пользователей, которые могут закончить поиск по той же теме.Если вы оказались в
vim
использованииисточник
пример:
источник
Попробуйте
tac
, который работает в Linux, и если это не работает, используйтеtail -r
, который работает в BSD и OSX.источник
tac myfile.txt
- что мне не хватает?tail -r
в случае, еслиtac
он недоступен.tac
не соответствует POSIX. Ни то, ни другоеtail -r
. Все еще не надежно, но это повышает шансы на то, что все работает.tac
доступно, но не хватает оперативной памяти и поменять местами на полпути, потребляя гигантский поток ввода. Это терпит неудачу, и затемtail -r
успешно обрабатывает остаток потока, давая неправильный результат.brew install coreutils
и использоватьgtac
вместоtac
и, если вы предпочитаете, добавить tac в качестве псевдонима,gtac
если, например, вам нужен сценарий оболочки, который использовал его кросс-платформенный (Linux, OSX)Попробуйте следующую команду:
источник
sed 's/^[0-9]*://g'
nl
по умолчанию не будет нумерация пустых строк.-ba
Опция доступна на некоторых системах, не не является универсальным (HP / UX приходит на ум, хотя я бы это не так) , тогдаgrep -n
всегда будет номер каждой строки , которая соответствует (в данном случае пустой) регулярное выражение.cut -d: -f2-
Просто Баш :) (4.0+)
источник
-nenenenenenene
и посмотрите причину, по которой люди рекомендуют всегда использоватьprintf '%s\n'
вместоecho
.Самый простой метод - это использование
tac
команду.tac
являетсяcat
обратным. Пример:источник
Мне действительно нравится ответ " tail -r ", но мой любимый ответ gawk - ....
источник
mawk
на Ubuntu 14.04 LTS - работает, поэтому оно не является специфичным для GNU awk. +1n++
можно заменить наNR
РЕДАКТИРОВАТЬ следующее генерирует случайным образом отсортированный список чисел от 1 до 10:
где точки заменены фактической командой, которая переворачивает список
нолики
Python: использование [:: - 1] на sys.stdin
источник
Для кросс-ОС (то есть OSX, Linux) решение, которое может использовать
tac
внутри сценария оболочки, используйте homebrew, как уже упоминалось выше, тогда просто псевдоним tac выглядит так:Установить lib
Для MacOS
Для Linux Debian
Затем добавьте псевдоним
источник
Это будет работать как на BSD, так и на GNU.
источник
Если вы хотите изменить файл на месте, вы можете запустить
Это избавляет от необходимости создавать временный файл, а затем удалять или переименовывать оригинал и имеет тот же результат. Например:
На основании ответа от ephemient , который сделал почти, но не совсем то, что я хотел.
источник
Со мной случается, что я хочу получить последние
n
строки очень большого текстового файла эффективно .Первое, что я попробовал
tail -n 10000000 file.txt > ans.txt
, но я нашел это очень медленно, дляtail
приходится искать местоположение и затем возвращаться, чтобы напечатать результаты.Когда я понимаю это, я переключаюсь на другое решение:
tac file.txt | head -n 10000000 > ans.txt
. На этот раз, позиция поиска просто должна переместиться с конца на желаемое место, и это экономит 50% времени !Взять домой сообщение:
Используйте,
tac file.txt | head -n n
если у васtail
нет-r
опции.источник
Лучшее решение:
источник
Для пользователей Emacs:
C-x h
(выберите весь файл), а затемM-x reverse-region
. Также работает только для выбора частей или линий и их возврата.источник
Я вижу много интересных идей. Но попробуй мою идею. Направьте ваш текст в это:
что предполагает, что символ '~' отсутствует в файле. Это должно работать на каждой оболочке UNIX начиная с 1961 года. Или что-то в этом роде.
источник
У меня был тот же вопрос, но я также хотел, чтобы первая строка (заголовок) оставалась сверху. Поэтому мне нужно было использовать силу awk
PS тоже работает в cygwin или gitbash
источник
1\n20\n19...2\n
а не20\n19...\2\n1\n
.Вы можете сделать это с
vim
stdin
иstdout
. Вы также можете использовать,ex
чтобы быть POSIX-совместимым .vim
это просто визуальный режим дляex
. На самом деле, вы можете использоватьex
сvim -e
илиvim -E
(улучшенныйex
режим).vim
полезен, потому что в отличие от таких инструментов, какsed
он, буферизует файл для редактирования, аsed
используется для потоков. Вы могли бы использоватьawk
, но вам придется вручную буферизовать все в переменной.Идея состоит в том, чтобы сделать следующее:
g/^/m0
. Это означает глобально, для каждой строкиg
; соответствует началу строки, которая соответствует чему-либо^
; переместить его после адреса 0, который является строкой 1m0
.%p
. Это означает для диапазона всех линий%
; напечатать строкуp
.q!
. Это значит броситьq
; силой!
.Как сделать это многоразовым
Я использую скрипт, который я вызываю
ved
(например, vim editorsed
), чтобы использовать vim для редактированияstdin
. Добавьте это к файлу, названномуved
в вашем пути:Я использую одну
+
команду вместо+'%p' +'q!'
, потому что vim ограничивает вас до 10 команд. Таким образом, объединение их позволяет"$@"
иметь 9+
команд вместо 8.Тогда вы можете сделать:
Если у вас нет vim 8, вставьте это
ved
вместо:источник
или
или
источник
tail -r работает в большинстве систем Linux и MacOS
сек 1 20 | хвост -r
источник
или
источник
sort -r
работает, только если вход уже отсортирован, что здесь не так.rev
переворачивает символы в строке, но сохраняет порядок строк, что тоже не то, о чем просил Скотти. Так что этот ответ на самом деле не является ответом вообще.