如何反转文本文件的行?

时间:2009-01-06 21:38:25

标签: shell command-line filter reverse

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

有更好,更通用的方法吗?

9 个答案:

答案 0 :(得分:48)

GNU coreutils中,有tac(1)

答案 1 :(得分:22)

答案不是42,而是 tac

修改:使用sed

更慢但耗费更多内存
sed 'x;1!H;$!d;x'

甚至更长

perl -e'print reverse<>'

答案 2 :(得分:22)

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

tail -r file.txt

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

答案 3 :(得分:2)

cat -b只编号非空行“


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

答案 4 :(得分: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]*://'

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

答案 5 :(得分:1)

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

perl -e 'print reverse <>'

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

rev <name of your text file.txt>

你甚至可以这样做:

echo <whatever you want to type>|rev

答案 8 :(得分:0)

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

sed更快,并且与openwrt等嵌入式设备兼容。