Как перевернуть строки текстового файла? - PullRequest
25 голосов
/ 07 января 2009

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

Мое конкретное приложение состоит в том, что я получаю список идентификаторов коммитов 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 только нумерует непустые строки.

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

Ответы [ 9 ]

48 голосов
/ 07 января 2009
22 голосов
/ 14 ноября 2011

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

tail -r file.txt

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

22 голосов
/ 07 января 2009

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

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

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

и даже дольше

perl -e'print reverse<>'
2 голосов
/ 20 января 2009
cat -b только цифры непустых строк "


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

1 голос
/ 26 мая 2016

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

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
1 голос
/ 06 мая 2010

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

perl -e 'print reverse <>'
1 голос
/ 07 января 2009
:   "@(#)$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]*://'

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

0 голосов
/ 18 апреля 2019
awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'

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

0 голосов
/ 26 мая 2016
rev <name of your text file.txt>

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

echo <whatever you want to type>|rev
...