it-swarm.com.de

So erhalten Sie die Zeilen 10 bis 100 aus einer Datei mit 200 Zeilen in eine neue Datei

Ich habe eine Datei mit 200 Zeilen.

Ich muss Zeilen von 10 bis 100 extrahieren und sie in eine neue Datei einfügen.

Wie macht man das unter Unix/Linux?

Welche möglichen Befehle könnten Sie verwenden?

22
sunil

Verwenden Sie sed :

sed -n -e '10,100p' input.txt > output.txt

sed -n Bedeutet, dass nicht standardmäßig jede Zeile druckt. -e Bedeutet, das nächste Argument als sed-Skript auszuführen. 10,100p Ist ein sed-Skript, das bedeutet, dass in Zeile 10 bis Zeile 100 (einschließlich) diese Zeile gedruckt wird (p). Dann wird die Ausgabe in output.txt Gespeichert.

Wenn Ihre Datei länger als vorgeschlagen ist, ist diese Version (in den Kommentaren vorgeschlagen) schneller:

sed -e '1,9d;100q'

Das heißt, löscht die Zeilen 1-9, beendet nach Zeile 100 und Drucken Sie den Rest aus. Für 200 Zeilen spielt es keine Rolle, aber für 200.000 Zeilen wird die erste Version immer noch jede Zeile betrachten, selbst wenn sie niemals gedruckt wird. Ich bevorzuge die erste Version im Allgemeinen, um explizit zu sein, aber mit einer langen Datei wird dies viel schneller sein - Sie kennen Ihre Daten am besten.

Alternativ können Sie head und tail in Kombination verwenden:

tail -n +10 input.txt | head -n 91 > output.txt

Dieses Mal druckt tail -n +10 Die gesamte Datei ab Zeile 10 aus, und head -n 91 Druckt die ersten 91 Zeilen davon (bis einschließlich Zeile 100 der Originaldatei). Es wird auf die gleiche Weise zu output.txt Umgeleitet.

41
Michael Homer

Wenn Sie dies in vim tun würden, wäre es ziemlich einfach. Angenommen, Ihre Datei heißt src und die Datei, in die Sie die Zeilen verschieben möchten, ist dest. Wenn dest noch nicht vorhanden ist, würden Sie es erstellen:

touch dest

Öffnen Sie dann sowohl src als auch dest in vim (das -p Flag öffnet die Argumente in Registerkarten):

vim -p src dest

Springe zur zehnten Zeile; Wählen Sie alles von der 10. bis zur 100. Zeile. Ruck; Wechseln Sie zu der Registerkarte mit dest. Einfügen.

10ggv101ygtp

Anmerkung: das 101 wählt am Anfang der 101. Zeile aus (fängt das \n am Ende der Zeile 100).


Das ist natürlich ein etwas aufwendigerer Prozess als die Verwendung eines Befehlszeilentools, hat jedoch den Vorteil, dass Sie eine visuelle Auswahl erhalten (damit Sie sicher sein können, dass Sie alles bekommen, was Sie wollen). Dies scheint jedoch auch ein guter Anwendungsfall für awk zu sein:

awk 'NR==10, NR==100' src > dest

Mit der Variablen NR können Sie Muster an die Anzahl der Zeilen anpassen. Daher extrahiert der obige Befehl die Zeilen 10–100 aus src, und dann leitet Ihre Shell die Ausgabe an dest um.

7
HalosGhost

Das sollte reichen

tail -n +10 file.txt | head -n 91 > newfile.txt

6
Creek

Sie können es auf viele Arten tun.

Eine awk Lösung:

$ awk 'NR<10{next};1;NR>100{exit}' file > new_file

Eine Perl Lösung:

$ Perl -nle '
    print if $. > 9 and $. < 101;
    exit if $. > 100;
' file > new_file
3
cuonglm