How to reverse lines of a text file?

2020-02-27 01:53发布

I'm writing a small shell script that needs to reverse the lines of a text file. Is there a standard filter command to do this sort of thing?

My specific application is that I'm getting a list of Git commit identifiers, and I want to process them in reverse order:

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

The best I've come up with is to implement reverse like this:

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

This uses cat to number every line, then sort to sort them in descending numeric order (which ends up reversing the whole file), then cut to remove the unneeded line number.

The above works for my application, but may fail in the general case because cat -b only numbers nonblank lines.

Is there a better, more general way to do this?

9条回答
Explosion°爆炸
2楼-- · 2020-02-27 02:15
awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'

More faster than sed and compatible for embed devices like openwrt.

查看更多
霸刀☆藐视天下
3楼-- · 2020-02-27 02:16

There is a standard command for your purpose:

tail -r file.txt

prints the lines of file.txt in reverse order!

查看更多
Lonely孤独者°
4楼-- · 2020-02-27 02:20

Answer is not 42 but tac.

Edit: Slower but more memory consuming using sed

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

and even longer

perl -e'print reverse<>'
查看更多
ら.Afraid
5楼-- · 2020-02-27 02:23
:   "@(#)$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]*://'

Works like a charm for me...

查看更多
一纸荒年 Trace。
6楼-- · 2020-02-27 02:27
来,给爷笑一个
7楼-- · 2020-02-27 02:30

In this case, just use --reverse:

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
查看更多
登录 后发表回答