Перемещение 1000 верхних строк из текстового файла в новый файл с помощью команд оболочки Unix
Я хочу скопировать верхние 1000 строк в текстовый файл, содержащий более 50 миллионов записей, в другой новый файл, а также удалить эти строки из исходного файла.
есть ли способ сделать то же самое с одной командой оболочки в Unix?
6 ответов:
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
из любопытства я нашел коробку с версией GNU
sed(v4.1.5) и протестировал (некэшированную) производительность двух подходов, предложенных до сих пор, используя текстовый файл строки 11M:$ 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для этого теста, по крайней мере, это выглядит как
sedменьше, чемtailподход (27 сек против ~14 сек).
Это однострочный, но использует четыре атомарные команды:
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
Comments