Я хочу напечатать строки из файла в обратном направлении без использования tac
команды. Есть ли другое решение, чтобы сделать такую вещь с Bash?
shell
text-processing
jimmij
источник
источник
Ответы:
Использование
sed
для эмуляцииtac
:источник
sed
лайнер. Смотрите "36. Обратный порядок строк (эмулируйте" tac "Unix command)." в известном Sed One-Liners объяснил для полного объяснения того, как это работает.sort
- есть вероятность, что он будет использовать временный файл).С
ed
:Если вы на
BSD
/OSX
(и , надеюсь , в ближайшее время наGNU
/linux
тоже , как это будет POSIX ):источник
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
через awk один лайнер
источник
awk 'a=$0RS a{}END{printf a}'
but your first
perl reverse <> `это лучший / самый быстрый ответ на странице (для меня), в 10 раз быстрее, чем этотawk
ответ (все awk anseres примерно одинаковы по времени)awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
Как вы просили сделать это в bash, вот решение, которое не использует awk, sed или perl, а только функцию bash:
Выход из
является
Как и ожидалось.
Но имейте в виду, что строки хранятся в памяти, по одной строке в каждом рекурсивно вызванном экземпляре функции. Так осторожно с большими файлами.
источник
Вы можете передать это через:
Перед
awk
каждой строкой ставится префикс номера строки, за которым следует пробел.sort
Изменяет порядок строк при сортировке по первому полю (номер строки) в обратном порядке, числовой стиль. Иsed
полоски с номера строк.Следующий пример показывает это в действии:
Это выводит:
источник
cat -n
действует так же, какawk '{print NR" "$0}'
В perl:
источник
perl -e 'print reverse<>'
perl -pe '$\=$_.$\}{'
)reverse<)
быстро: хорошо! но «действительно уродливый» чрезвычайно медленный, так как количество линий увеличивается. !! ....-n
спасибо, спасибо.sort
).BASH-только решение
прочитать файл в массив bash (одна строка = один элемент массива) и распечатать массив в обратном порядке:
источник
while..read
.IFS=''
иread -r
для предотвращения всех видов побегов и конечного удаления IFS от обворовывания. Я думаю, чтоmapfile ARRAY_NAME
встроенная функция bash - лучшее решение для чтения массивов.Bash,
mapfile
упомянутое в комментариях к fiximan, и, возможно, лучшая версияЕго производительность в основном сопоставима с
sed
решением и становится быстрее по мере уменьшения количества запрашиваемых строк.источник
источник
как показано здесь:
Результат:
источник
источник