[英]Move last n lines of a text file to the top with Bash
如何在不知道文件行數的情況下將文本文件的最后 n 行移動到頂部? 是否可以使用單個命令行(例如使用sed
)來實現這一點?
從:
...
a
b
c
d
到:
a
b
c
d
...
如果輸入源來自管道,您可能會發現很難。 在這種情況下,您可以使用
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
保存並退出。
與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.