如何反转文本文件的行?

shell command-line filter reverse

17190 观看

9回复

683425 作者的声誉

我正在编写一个需要反转文本文件行的小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只有非空行数。

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

作者: Greg Hewgill 的来源 发布者: 2009 年 1 月 6 日

回应 (9)


22

23714 作者的声誉

答案不是42但是tac

编辑:使用较慢但耗费更多内存sed

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

甚至更长

perl -e'print reverse<>'
作者: Hynek -Pichi- Vychodil 发布者: 06.01.2009 09:40

47

207122 作者的声誉

决定

GNU coreutils中,有tac(1)

作者: Vinko Vrsalovic 发布者: 06.01.2009 09:43

1

575601 作者的声誉

:   "@(#)$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]*://'

像我的魅力一样......

作者: Jonathan Leffler 发布者: 06.01.2009 11:26

2

0 作者的声誉

cat -b只编号非空行“


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

作者: Jess 发布者: 20.01.2009 05:32

1

4340 作者的声誉

与上面的sed示例类似,使用perl - 可能更难忘(取决于你的大脑如何连线):

perl -e 'print reverse <>'
作者: Gavin Brock 发布者: 06.05.2010 02:40

21

616 作者的声誉

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

tail -r file.txt

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

作者: porg 发布者: 14.11.2011 05:13

0

1 作者的声誉

rev <name of your text file.txt>

你甚至可以这样做:

echo <whatever you want to type>|rev
作者: kcidkcus 发布者: 26.05.2016 08:36

1

4639 作者的声誉

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

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
作者: OJFord 发布者: 26.05.2016 08:53

0

190 作者的声誉

awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'

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

作者: martian 发布者: 18.04.2019 03:05
32x32