簡體   English   中英

使用 Bash 將文本文件的最后 n 行移到頂部

[英]Move last n lines of a text file to the top with Bash

如何在不知道文件行數的情況下將文本文件的最后 n 行移動到頂部? 是否可以使用單個命令行(例如使用sed )來實現這一點?

從:

...
a
b
c
d

到:

a
b
c
d
...

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

這可能對你有用(GNU sed):

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

將除最后一行之外的每一行附加到保留空間,然后將保留空間附加到最后一行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM