29

我正在编写一个需要反转文本文件行的小型 shell 脚本。是否有标准的过滤器命令来做这种事情?

我的具体应用是我得到一个 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只有数字非空行。

有没有更好、更通用的方法来做到这一点?

4

9 回答 9

55

GNU coreutils中,有tac(1)

于 2009-01-06T21:43:22.680 回答
27

有一个标准命令可用于您的目的:

tail -r file.txt

以相反的顺序打印 file.txt 的行!

于 2011-11-14T17:13:39.850 回答
23

答案不是 42 而是tac

编辑:使用更慢但更消耗内存sed

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

甚至更长

perl -e'print reverse<>'
于 2009-01-06T21:40:39.410 回答
2
cat -b 仅编号非空行"


如果这是您要避免的唯一问题,那么为什么不使用“cat -n”对所有行进行编号呢?

于 2009-01-20T17:32:11.710 回答
2

与上面的sed示例类似,使用perl - 可能更容易记住(取决于你的大脑是如何连接的):

perl -e 'print reverse <>'
于 2010-05-06T02:40:26.357 回答
1
:   "@(#)$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]*://'

对我来说就像一个魅力......

于 2009-01-06T23:26:52.863 回答
1

在这种情况下,只需使用--reverse

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
于 2016-05-26T20:53:24.373 回答
0
rev <name of your text file.txt>

你甚至可以这样做:

echo <whatever you want to type>|rev
于 2016-05-26T20:36:38.483 回答
0
awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'

比 openwrt 等嵌入式设备更快sed且兼容。

于 2019-04-18T15:05:59.400 回答