Просмотрите страницы справочника в удобном для пользователя графическом приложении:
konqueror man:(command)
Для оглавления верхнего уровня:
konqueror man:
Функции:
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
через awk лайнеры
but your first
реверс жемчуга <>' это лучший/самый быстрый ответ на странице (мне), в в 10 раз быстрее, чем это awk
ответ (все awk anseres о том же, мудром временем)
– Peter.O
06.08.2012, 20:26
Когда Вы попросили делать это в ударе, вот решение, которое не использует awk, sed или жемчуг, просто функция удара:
reverse ()
{
local line
if IFS= read -r line
then
reverse
printf '%s\n' "$line"
fi
}
Вывод
echo 'a
b
c
d
' | reverse
d
c
b
a
Как ожидалось.
Но остерегайтесь этого, строки хранятся в памяти, одной строке в каждом рекурсивно названном экземпляре функции. Настолько осторожный с большими файлами.
Можно передать его по каналу через:
awk '{print NR" "$0}' | sort -k1 -n -r | sed 's/^[^ ]* //g'
awk
префиксы каждая строка с номером строки, сопровождаемым пространством. sort
инвертирует порядок строк путем сортировки на первом поле (номер строки) в обратном порядке, числовой стиль. И sed
снимает изоляцию с номеров строки.
Следующий пример показывает это в действии:
pax$ echo 'a
b
c
d
e
f
g
h
i
j
k
l' | awk '{print NR" "$0}' | sort -k1 -n -r | sed 's/^[^ ]* //g'
Это производит:
l
k
j
i
h
g
f
e
d
c
b
a
В жемчуге:
cat <somefile> | perl -e 'while(<>) { push @a, $_; } foreach (reverse(@a)) { print; }'
perl -pe '$\=$_.$\}{'
)
– ninjalj
18.03.2011, 01:21
reverse<)
быстро: хороший! но "действительно ужасный" является чрезвычайно медленным как количество увеличений строк.!!....
– Peter.O
06.08.2012, 19:41
С ed
:
ed -s infile <<IN
g/^/m0
,p
q
IN
Если вы используете BSD
/ OSX
(и, надеюсь, скоро на GNU
/ linux
также, как это будет POSIX ):
tail -r infile
Решение только для BASH
прочитать файл в массиве bash (одна строка = один элемент массива) и распечатать массив в обратный порядок:
i=0
while read line[$i] ; do
i=$(($i+1))
done < FILE
for (( i=${#line[@]}-1 ; i>=0 ; i-- )) ; do
echo ${line[$i]}
done
Bash с файлом карты
, упомянутым в комментариях к fiximan, и на самом деле, возможно, лучшая версия:
# last [LINES=50]
_last_flush(){ BUF=("${BUF[@]:$(($1-LINES)):$1}"); } # flush the lines, can be slow.
last(){
local LINES="${1:-10}" BUF
((LINES)) || return 2
mapfile -C _last_flush -c $(( (LINES<5000) ? 5000 : LINES+5 )) BUF
BUF=("${BUF[@]}") # Make sure the array subscripts make sence, can be slow.
((LINES="${#BUF[@]}" > LINES ? LINES : "${#BUF[@]}"))
for ((i="${#BUF[@]}"; i>"${#BUF[@]}"-LINES; i--)); do echo -n "${BUF[i]}"; done
}
Его производительность в основном сопоставима с решение sed
и становится быстрее по мере уменьшения количества запрашиваемых строк.
Simple do this with your file to sort the data in reverse order, and it should be unique.
sed -n '1h;1d;G;h;$p'
POSIX vi делает это, поэтому также ed или ex.
ви:
:g/^/m0
бывший:
ex -s infile <<EOS
g/^/move0
x
EOS
изд:
ed -s infile <<EOF
g/^/m0
,p
w
EOF
sed
острота. См. "36. Обратный порядок строк (эмулируют "tac" команду Unix)". в Известных Остротах Sed, Объясненных для полного объяснения того, как это работает. – Johnsyweb 16.03.2011, 13:37sort
- существует шанс, он будет использовать временный файл). – Random832 15.04.2011, 23:39