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

时间:2017-11-30 14:29:07

标签: 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-less-instances.arff

然而,当我运行它时,我收到错误:

head: illegal line count -- -3000

我不确定我哪里出错了,或者这可能是一个mac问题?

3 个答案:

答案 0 :(得分:4)

并非head的所有版本都支持负线计数。 macOS上安装的默认设置没有。

如果您安装了coreutils(如果您安装了Homebrew,则可以执行此操作:brew install coreutils)您应该可以使用ghead -n -3000

答案 1 :(得分:3)

如果允许使用其他工具,可以转到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.

此处的优点是$自动匹配最后一行。

答案 2 :(得分:2)

阅读更多信息来自POSIX head and tail not feature equivalenthead的POSIX版本接受-n选项的否定整数。

POSIX head命令文档中进行Qutoting,

  

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

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