使用 POSIX 工具反转文件顺序?

使用 POSIX 工具反转文件顺序?

是否有任何干净、清晰的 POSIX 等价物tac

可读性和简洁性都应该考虑。

答案1

最干净的POSIX相当于

tail -r

作为

-r          Reverse. Copies lines from the specified starting point in
            the file in reverse order. The default for r is to print the
            entire file in reverse order.

已接受下一个POSIX问题(希望它很快就会在所有平台上得到支持)。


如果tail -r不可用,可以成功使用“经典”文本处理工具(正如您和其他人所展示的那样)来反转文件中的行。
撇开可读性和简洁性不谈,即使是老的ed也能做到:

ed -s infile <<\IN
g/^/m0
,p
q
IN

或者,如果您想要反转管道的输出 - 首先将其读入文本缓冲区:

ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN

答案2

您可以使用sed一行代码来完成此操作,如下所示,尽管它对于“外行”来说肯定不可读:

sed -n '1h;1!{x;H;};${g;p;}' file.txt

解释:

-n禁止sed打印每一行的默认操作。

1h导致第一行存储在保留空间中。

1!{...}将此命令块应用于所有行除了对于第一个。

x交换保持空间和模式空间。 (模式空间是处理每行时存储的位置。)然后H将换行符附加到保留空间,后跟模式空间的(新)内容。

${...}仅当到达最后一行时才应用 最后一个块。g获取保留空间的内容并将其放入模式空间,并p打印模式空间。

当然,这取决于能否将整个文件一次性保存在内存中;它可能会在非常大的文件上失败。

答案3

这是一个将整个文件存储在内存中的 awk 脚本:

awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' file

表述为 shell 函数:

tac () { awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' "$@"; }

答案4

POSIX vi你有吗?编辑或者前任

我更喜欢如果我无论如何都要查看输出的话,我自己就可以了。

命令模式,当然:

:g/^/m0

如果您不想反转整个文件,只要您注意移动内容的位置和方式,您始终可以指定 :ga 范围:

:1,10g/^/m0

您可以使用以下内容ed编写脚本:ex

$ ed -s infile <<IN
g/^/m0
,p
w
IN

$ ex -s infile <<EOS
g/^/move0
wq
EOS

我一直这样做。

“-r”切换到尾巴在本文发表时不符合 POSIX 标准:

tail [-f] [-c number|-n number] [file]

相关内容