Как перевернуть строки текстового файла?

Я пишу небольшую оболочку script, которая должна перевернуть строки текстового файла. Есть ли стандартная команда фильтра, чтобы делать такие вещи?

Моим конкретным приложением является то, что я получаю список Git идентификаторов фиксации, и я хочу обработать их в обратном порядке:

git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse

Самое лучшее, что я придумал, - реализовать reverse следующим образом:

... | cat -b | sort -rn | cut -f2-

Здесь используется cat для номера каждой строки, затем sort, чтобы отсортировать их по убыванию порядкового номера (который заканчивает обратный вспять весь файл), затем cut, чтобы удалить ненужный номер строки.

Вышеупомянутое работает для моего приложения, но может не работать в общем случае, потому что cat -b содержит только номера непустых строк.

Есть ли лучший, более общий способ сделать это?

Ответ 2

Ответ не 42, а tac.

Изменить: Медленнее, но больше потребляемой памяти, используя sed

sed 'x;1!H;$!d;x'

и даже дольше

perl -e'print reverse<>'

Ответ 3

Для вашей цели существует стандартная команда:

tail -r file.txt

печатает строки file.txt в обратном порядке!

Ответ 4

cat -b только числа непустые строки


Если это единственная проблема, которую вы хотите избежать, то почему бы не использовать "cat -n" для номера всех строк?

Ответ 5

:   "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp $"
#
#   Reverse the order of the lines in each file

awk ' { printf("%d:%s\n", NR, $0);}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'

Работает как очарование для меня...

Ответ 6

Подобно примеру sed, используя perl - возможно, более запоминающимся (в зависимости от того, как ваш мозг подключен):

perl -e 'print reverse <>'

Ответ 7

В этом случае просто используйте --reverse:

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1

Ответ 8

rev <name of your text file.txt>

Вы можете даже сделать это:

echo <whatever you want to type>|rev

Ответ 9

awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'

Более быстрый, чем sed и совместимый для встраивания устройств.