Wie kann ich den Inhalt einer Textdatei kopieren und ab einer bestimmten Zeile in eine andere einfügen?

12

Ich muss den Inhalt einer Textdatei kopieren und in eine andere Textdatei einfügen. Die erste Textdatei enthält 10 Datenzeilen. Diese müssen beispielsweise ab Zeile 5 in die zweite Textdatei kopiert werden. In der zweiten Textdatei sollten diese Daten also von Zeile 5 bis Zeile 14 geschrieben werden. Wie kann das geschehen? Danke im Voraus. Betrachten Sie mich als Neuling in Bezug auf Linux.

G. Paschalis
quelle

Antworten:

9

headund tailLösung

Angenommen, die Quelldatei wird aufgerufen ~/aund die einzufügende Datei wird aufgerufen ~/b. Wir legen die zusammengeführte Datei in ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • Der Pfad ~/ist eine Abkürzung für Ihren /home/userVerzeichnisnamen
  • head kopiert die ersten fünf Zeilen der Datei ain eine neu erstellte Dateic
  • cat listet den Inhalt der Datei auf bund hängt ihn an die Datei anc
  • tail hängt die Datei abeginnend mit Zeile 6 bis zum Dateiende anc

Nach der Überprüfung benennen Sie die zusammengeführte Datei um

Nachdem die Datei Verifizieren ckorrekt von Dateien zusammengefügt aund bwir werden umbenennen czu averwenden:

mv ~/c ~/a
  • mvverschiebt Datei cin Datei a. Daten werden nicht physisch verschoben. Die Datei wird einfach umbenannt, was Zeit spart.
WinEunuuchs2Unix
quelle
Vielen Dank für Ihre Antwort. Es hat gut funktioniert. Gibt es jedoch eine andere Möglichkeit, ohne eine dritte Textdatei zu verwenden?
G. Paschalis
Die dritte Datei kann anschließend in die Quelldatei umbenannt werden. Ich fand es am besten, die Datei zuerst anzeigen zu können. Ich werde jetzt die zusätzlichen Schritte zur Antwort hinzufügen.
WinEunuuchs2Unix
Oder ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt
1
@JJoao Das ist eine nette einzeilige Zusammenfassung :) Für Unterrichtszwecke bevorzuge ich die einzeilige Methode pro Befehl und verschachtelte if-Anweisungen. Aber zum Kopieren und Einfügen in das Terminal liebe ich die Einzeiler!
WinEunuuchs2Unix
16

Das einfachste Werkzeug könnte hier sein sed. So fügen Sie b.txtin a.txtnach der fünften Zeile, könnten Sie schreiben:

sed '5r b.txt' a.txt

sedLiest die als argument ( a.txt) angegebene Datei zeilenweise. Alle Zeilen werden in der Ausgabe so wiedergegeben, wie sie in der Eingabe erschienen sind, es sei denn, sie werden durch einen Befehl geändert.

Dies 5ist eine Adresse (Zeilennummer), an der der folgende Befehl ausgeführt werden soll. Der Befehl, den wir verwenden, ist r, der einen Dateinamen als Argument verwendet (hier b.txt), ihn vollständig liest und in die Ausgabe nach der aktuellen Zeile einfügt.

Wie oben angegeben, seddruckt diese Befehlszeile nur die Ausgabe auf das Terminal, ohne in Dateien zu schreiben. Sie können es entweder in eine neue Datei umleiten (keine der Eingabedateien!), Indem Sie die Ausgabeumleitung von Bash verwenden:

sed '5r b.txt' a.txt > c.txt

Oder Sie können die äußere Eingabedatei direkt ändern, a.txtindem Sie sedden -iSchalter (für "In-Place") verwenden. Wenn Sie es als schreiben -i.bak, wird zuerst eine Sicherungskopie der ursprünglichen Eingabedatei mit dem Suffix erstellt .bak:

sed -i '5r b.txt' a.txt

Ein Beispiel:

$ cat a.txt 
January
February
March
April
May
October
November
December

$ cat b.txt 
June
July
August
September

$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December
Byte Commander
quelle
0

(Wiederverwenden des eleganten Beispiels von @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt

quelle