【问题标题】:Move last n lines of a text file to the top with Bash使用 Bash 将文本文件的最后 n 行移动到顶部
【发布时间】:2018-09-11 02:33:43
【问题描述】:

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

发件人:

...
a
b
c
d

收件人:

a
b
c
d
...

【问题讨论】:

  • 欢迎来到 SO。 Stack Overflow 是一个面向专业和狂热程序员的问答网站。目标是您将一些自己的代码添加到您的问题中,以至少显示您为解决这个问题所做的研究工作。

标签: bash sed command


【解决方案1】:

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

来自man head

-n, --lines=[-]NUM

打印前 NUM 行而不是前 10 行;使用前导“-”,打印每个文件的最后 NUM 行以外的所有行

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 保存并退出。

【讨论】:

  • 三只的价格 - 不错!
  • head/tail 解决方案应该是最快的,并且使用更少的内存。
【解决方案2】:

这可能对你有用(GNU sed):

sed '$!H;1h;$!d;G' file

将除最后一行之外的每一行附加到hold space,然后将保留空间附加到最后一行。

【讨论】:

    【解决方案3】:

    ed 无关

    将最后的30 行移到文件顶部。

    printf '%s\n' '30,$m0' ,p Q | ed -s file.txt
    

    在文件顶部移动 10 到 50 行。

    printf '%s\n' '10,50m0' ,p Q | ed -s file.txt
    

    将 1 到 10 移动到最后一行/缓冲区。

    printf '%s\n' '1,10m$' ,p Q | ed -s file.txt
    

    在最后一行/缓冲区移动 40 到 80

    printf '%s\n' '40,80m$' ,p Q | ed -s file.txt
    
    • 行地址0是第一个,m表示移动

    • $ 是缓冲区/文件的最后一行。

    • Q 更改为w 以实际编辑file.txt

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多