使用Unix shell命令将1000行文本文件移动到新文件中

我希望将包含超过5000万个条目的文本文件中的前1000行复制到另一个新文件,并从原始文件中删除这些行。

有什么办法可以在Unix中使用单个shell命令吗?

head -1000 input > output && sed -i '1,+999d' input 

例如:

 $ cat input 1 2 3 4 5 6 $ head -3 input > output && sed -i '1,+2d' input $ cat input 4 5 6 $ cat output 1 2 3 
 head -1000 file.txt > first100lines.txt tail --lines=+1001 file.txt > restoffile.txt 

出于好奇,我find了一个GNU版sed (v4.1.5)的盒子,并使用11M行文本文件testing了迄今为止build议的两种方法(未caching)的性能:

 $ wc -l input 11771722 input $ time head -1000 input > output; time tail -n +1000 input > input.tmp; time cp input.tmp input; time rm input.tmp real 0m1.165s user 0m0.030s sys 0m1.130s real 0m1.256s user 0m0.062s sys 0m1.162s real 0m4.433s user 0m0.033s sys 0m1.282s real 0m6.897s user 0m0.000s sys 0m0.159s $ time head -1000 input > output && time sed -i '1,+999d' input real 0m0.121s user 0m0.000s sys 0m0.121s real 0m26.944s user 0m0.227s sys 0m26.624s 

这是我正在使用的Linux:

 $ uname -a Linux hostname 2.6.18-128.1.1.el5 #1 SMP Mon Jan 26 13:58:24 EST 2009 x86_64 x86_64 x86_64 GNU/Linux 

至less在这个testing中,看起来像sedtail更慢(27秒vs 14秒)。

这是一个单线程,但使用四个primefaces命令:

 head -1000 file.txt > newfile.txt; tail +1000 file.txt > file.txt.tmp; cp file.txt.tmp file.txt; rm file.txt.tmp 

Perl方法:

 perl -ne 'if($i<1000) { print; } else { print STDERR;}; $i++;' in 1> in.new 2> out && mv in.new in