gpt4 book ai didi

bash - 使用 Bash 将文本文件的最后 n 行移动到顶部

转载 作者:行者123 更新时间:2023-12-02 00:30:00 27 4
gpt4 key购买 nike

如何在不知道文件行数的情况下将文本文件的最后 n 行移动到顶部?是否可以通过单个命令行(例如使用 sed)实现这一点?

来自:

...
a
b
c
d

收件人:

a
b
c
d
...

最佳答案

2021 年更新:

使用 vim 的 ex 模式更简单:(灵感来自 this answer )

vim -        -esc '$-3,$m0|%p|q!' --not-a-term  # when processing a pipe
vim file.txt -esc '$-3,$m0|%p|q!' --not-a-term # when processing a file to stdout
vim file.txt -esc '$-3,$m0|wq' --not-a-term # when editing a file inline

这会将最后 4 行(最后一行 + 最后一行之前的 3 行)移到顶部。将 3 更改为您想要的数字。

MWE:

seq 10 | vim - '-esc$-3,$m0|%p|q!' --not-a-term

输出:

7
8
9
10
1
2
3
4
5
6

2020 年更新:

如果输入源来自管道,您可能会觉得很难。在这种情况下,您可以使用

awk '{a[NR-1]=$0}END{for(i=0;i<NR;++i)print(a[(i-4+NR)%NR])}'

这会将所有行存储在内存中(这可能是一个问题),然后将它们输出。更改命令中的 4 以查看不同的结果。


显示最后n行,然后显示其余的:

tail -n 4 file; head -n -4 file

来自人头:

-n, --lines=[-]NUM

print the first NUM lines instead of the first 10; with the leading '-', print all but the last NUM lines of each file

tail -n 4 将显示文件的最后 4 行。

如果你想通过管道传输这些数据,你需要像这样把它们放在一起:

( tail -n 4 file; head -n -4 file ) | wc

或者您可以使用 vim 内联编辑文件:

vim +'$-3,$m0' +'wq' file

vim 的 + 选项将运行它后面的 (Ex) 命令。 $-3,$m0 表示移动最后一行以上3行和最后一行到文件开头的行。请注意,+ 和命令之间不应有空格。


或者在vim普通模式下使用命令:

vim +'norm G3kdGggPZZ' file

G 到文件末尾; 3k 向上移动 3 行; dG 删除到文件末尾; gg 转到文件顶部; P 将删除的行粘贴到该行之前; ZZ 保存并退出。

关于bash - 使用 Bash 将文本文件的最后 n 行移动到顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52267905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com