Ich habe eine Datei mit 200 Zeilen.
Ich muss die Zeilen 10 bis 100 extrahieren und in eine neue Datei einfügen.
Wie macht man das unter Unix/Linux?
Welche Befehle könnten Sie verwenden?
Antwort1
Verwendensed:
sed -n -e '10,100p' input.txt > output.txt
sed -n
bedeutetnichtStandardmäßig wird jede Zeile gedruckt. -e
bedeutet, das nächste Argument als Sed-Skript auszuführen. 10,100p
ist ein Sed-Skript, das bedeutet, dass ab Zeile 10 bis einschließlich Zeile 100 p
diese Zeile gedruckt wird (). Anschließend wird die Ausgabe in gespeichert output.txt
.
Wenn Ihre Datei länger als vorgeschlagen ist, ist diese Version (vorgeschlagen in den Kommentaren) schneller:
sed -e '1,9d;100q'
Das bedeutetlöschenZeilen 1-9,aufhörennach Zeile 100 und drucke den Rest. Bei 200 Zeilen spielt das keine Rolle, aber bei 200.000 Zeilen wird die erste Version trotzdem jede Zeile prüfen, auch wenn sie sie nie ausdrucken wird. Ich bevorzuge generell die erste Version, weil sie eindeutig ist, aber bei 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 tail -n +10
wird die gesamte Datei ab Zeile 10 und head -n 91
die ersten 91 Zeilen davon (bis einschließlich Zeile 100 der Originaldatei) ausgedruckt. Die Weiterleitung erfolgt output.txt
auf die gleiche Weise.
Antwort2
Das sollte reichen
tail -n +10 file.txt | head -n 91 > newfile.txt
Antwort3
Wenn Sie dies in tun würden vim
, wäre es ziemlich einfach. Nehmen Sie an, Ihre Datei hat den Namen src
und die Datei, in die Sie die Zeilen verschieben möchten, ist dest
. Wenn dest
sie noch nicht existiert, würden Sie sie erstellen:
touch dest
Öffnen Sie dann sowohl als src
auch dest
in vim
(die -p
Flagge öffnet die Argumente in Tabs):
vim -p src dest
Zur zehnten Zeile springen; alles von der 10. bis zur 100. Zeile markieren; ziehen; zur Registerkarte mit dem Zeichen „“ wechseln dest
; einfügen.
10ggv101ygtp
Notiz: 101
wählt den Anfang der 101. Zeile aus (fängt den \n
am Ende der 100. Zeile ab).
Dies ist natürlich ein etwas komplizierterer Vorgang als die Verwendung eines Befehlszeilentools, hat aber den Vorteil, dass Sie eine visuelle Auswahl erhalten (so dass Sie sicher sein können, alles zu bekommen, was Sie wollen). Dies scheint jedoch auch ein guter Anwendungsfall für Folgendes zu sein awk
:
awk 'NR==10, NR==100' src > dest
Die NR
Variable ermöglicht Ihnen einen Mustervergleich mit der Anzahl der Zeilen. Der obige Befehl extrahiert also die Zeilen 10–100 aus src
und Ihre Shell leitet die Ausgabe dann an um dest
.
Antwort4
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