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

时间:2018-09-11 02:33:43

标签: bash sed command

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

发件人:

...
a
b
c
d

收件人:

a
b
c
d
...

3 个答案:

答案 0 :(得分:3)

显示最后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表示将最后一行和最后一行之上的三行之间的行移动到文件的开头。请注意,+和命令之间不应有空格。


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

vim +'norm G3kdGggPZZ' file

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

class Main { public static void main(String[] args) { String[] playersArray = {"Celine", "Amelia", "Olivia"}; int[] powerArray = {4, 2, 10}; //unsorted array of power int[] powerIndexes = {0, 1, 2}; int[] pointsArray = new int[3]; powerIndexes(powerArray, powerIndexes); assignPoints(powerIndexes, pointsArray); System.out.println("Round 1 : "); showResults(playersArray, powerArray, pointsArray); } //Change power indexes based on power public static void powerIndexes(int[] powerArray, int[] powerIndexes) { for (int i = 0; i < powerArray.length; i++) { for (int j = 0; j < powerArray.length; j++) { if (powerArray[i] < powerArray[j]) { int temp = powerIndexes[i]; powerIndexes[i] = powerIndexes[j]; powerIndexes[j] = temp; } } } } public static void assignPoints(int[] powerIndexes, int[] pointsArray) { for (int i = 0; i < powerIndexes.length; i++) { pointsArray[i] = powerIndexes[i] * 2 + 2; } } public static void showResults(String[] playersArray, int[] powerArray, int[] pointsArray) { for (int i = 0; i < playersArray.length; i++) { System.out.println("Joueur " + playersArray[i] + " | Puissances " + powerArray[i] + " | Points " + pointsArray[i]); } } }

无关紧要

将最后ed行移动到文件顶部。

30

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

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

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

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

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

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

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

  • $更改为Q以实际编辑w