Linux 将最后n行复制到新文件,然后从原始文件中删除n行

Linux 将最后n行复制到新文件,然后从原始文件中删除n行,linux,bash,macos,shell,Linux,Bash,Macos,Shell,所以我有一个文件,我想把最后3000行移到另一个不同的文件中,然后从原始文件创建一个新文件,而不需要最后3000行 我使用的是Mac,我使用的命令如下: tail -n 3000 fer2017-testing-reduced.arff >> fer2017-training-reduced-3000-more-instances.arff; head -n -3000 fer2017-testing-reduced.arff > fer2017-testing-reduced

所以我有一个文件,我想把最后3000行移到另一个不同的文件中,然后从原始文件创建一个新文件,而不需要最后3000行

我使用的是Mac,我使用的命令如下:

tail -n 3000 fer2017-testing-reduced.arff >> fer2017-training-reduced-3000-more-instances.arff; head -n -3000 fer2017-testing-reduced.arff > fer2017-testing-reduced-3000-less-instances.arff
但是,当我运行此命令时,会出现以下错误:

head: illegal line count -- -3000
我不确定我哪里出错了,或者这是否是mac的问题?

请阅读更多信息,了解原因,POSIX版本的
head
不接受
-n
选项的负整数

从命令文档中获取

-n number
应将每个输入文件的第一行数字复制到标准输出。 应用程序应确保数字选项参数为正十进制整数


您最好将
head-n-3000
更改为
tail-n+3001
以从文件的第
3000行开始,直到文件的末尾。或者使用GNU支持的
head
命令,该命令在Mac上作为GNU coreutils的一部分提供。

并非所有版本的
head
都支持负行计数。 macOS上安装的默认设置不适用


如果您已经安装(如果您已经安装,您可以这样做:
brew安装coreutils
),您应该能够使用
ghead-n-3000

如果允许使用其他工具,可以使用
sed

sed -n '3000,${p}' file > filenew # print lines 3000 to end to new file
sed -i '3000,${d}' file # Use inplace edit to delete lines 3000 to end from orig.
这里的优点是,
$
自动匹配最后一行