Vraag Verplaats de top 1000 regels van het tekstbestand naar een nieuw bestand met behulp van Unix shell-commando's


Ik wil de bovenste 1000 regels kopiëren in een tekstbestand met meer dan 50 miljoen vermeldingen, naar een ander nieuw bestand en ook deze regels uit het oorspronkelijke bestand verwijderen.

Is er een manier om hetzelfde te doen met een enkele shell-opdracht in Unix?


49
2018-04-29 05:33


oorsprong


antwoorden:


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

Bijvoorbeeld:

$ 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

67
2018-04-29 05:48



head -1000 file.txt > first100lines.txt
tail --lines=+1001 file.txt > restoffile.txt

15
2018-04-29 05:38



Uit nieuwsgierigheid vond ik een doos met een GNU-versie van sed (v4.1.5) en de (niet-gecauzeerde) uitvoering getest van twee tot nu toe voorgestelde benaderingen, met behulp van een 11M-tekstbestand:

$ 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

Dit is de Linux waarmee ik werkte:

$ 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

Voor deze test lijkt het tenminste sed is langzamer dan de tail naderen (27 sec vs ~ 14 sec).


11
2018-04-29 07:03



Dit is een one-liner maar gebruikt vier atomaire commando's:

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

5
2018-04-29 05:51



Perl-aanpak:

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

4
2018-04-29 08:02



Pijp gebruiken:

cat en-tl.100.en | head -10

1
2018-05-18 17:39