如何移动文件中的最后一行?

如何移动文件中的最后一行?

文件示例

line 1
line 2
line 3
line 4

line 4应该在之后line 1

line 1
line 4
line 2
line 3

重要提示:它可能超过 4 行,脚本必须以某种方式理解它必须读取最后一行,不是第 4 行。

答案1

另一种更慢、更长的版本。

#!/bin/sh

if [ ! -f "$1" ]
then
    printf "No input file\n"
    exit
fi

FIRST=`head -n 1 "${1}"`
LAST=`tail -n 1 "${1}"`
MID=`sed -n '$d; 2,$p' "${1}"`
printf "${FIRST}\n${LAST}\n${MID}\n"

exit

速度较慢,因为每次使用head,tailsed来访问文件。在大文件(或许多文件)上,这可能非常明显。

答案2

$ printf '4m1\n,p\n' | ed -s file
line 1
line 4
line 2
line 3

简短的ed脚本

4m1
,p

会将第四行移动到第一行之后,然后在终端中显示编辑缓冲区的内容。

要将结果保存到新文件,您可以使用类似的重定向

printf '4m1\n,p\n' | ed -s file >newfile

或者你可以告诉ed保存文件

printf '4m1\nw newfile\n' | ed -s file

该命令w newfile会将编辑的缓冲区保存到指定的文件中。没有文件名的命令w会将文件保存回原始文件名。

由于行编辑器ed将文件读入内存,因此如果文件大小合理但不是太大(小于千兆字节),则可以将其用于此类操作。


要移动最后的行,更改4$上面命令中的。

相关内容