Как перевернуть строки текстового файла?
-
03-07-2019 - |
Вопрос
Я пишу небольшой сценарий оболочки, который должен перевернуть строки текстового файла.Есть ли стандартная команда фильтра для подобных вещей?
Мое конкретное приложение заключается в том, что я получаю список идентификаторов коммитов 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
нумеруют только непустые строки.
Есть ли лучший и более общий способ сделать это?
Решение
В GNU coreutils есть tac (1)
Другие советы
Ответ не 42, а tac
.
Редактировать : медленнее, но больше потребляет памяти, используя sed
sed 'x;1!H;$!d;x'
и даже дольше
perl -e'print reverse<>'
Для вашей цели есть стандартная команда:
tail -r file.txt
печатает строки file.txt в обратном порядке!
cat -b нумерует только непустые строки"
Если это единственная проблема, которой вы хотите избежать, то почему бы не использовать «cat -n» для нумерации всех строк?
: "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp <*>quot;
#
# Reverse the order of the lines in each file
awk ' { printf("%d:%s\n", NR, <*>);}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'
Работает как очарование для меня ...
Аналогично приведенному выше примеру sed с использованием perl - возможно, более запоминающимся (в зависимости от того, как устроен ваш мозг):
perl -e 'print reverse <>'
В этом случае просто используйте - reverse
:
$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>
Вы даже можете сделать это:
echo <whatever you want to type>|rev
awk '{a[i++]=<*>}END{for(;i-->0;)print a[i]}'
Более быстрый, чем sed
, и совместимый для таких устройств, как openwrt.