So fügen Sie mit sed neue Zeilen aus einer anderen Datei hinzu

So fügen Sie mit sed neue Zeilen aus einer anderen Datei hinzu

Ich versuche, den sedBefehl zu finden, den ich einfügen kann filename. filename1Dies sind meine beiden separaten Dateien.

INPUT filenamehat:

Cindy   11 22 54
Chester 48 12 84

INPUT filename1hat:

 Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96


Jefferry 84     98     90

Dies ist das Ergebnis, das ich brauche (Ausgabe):

Name   Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Cindy    11     22     54
Chester  48     12     84
Jefferry 84     98     90

Wenn ich etwas klarstellen muss, lassen Sie es mich wissen. Grundsätzlich müssen Cindy und Chester genau zwischen Dora und Jefferry liegen.

Antwort1

Um mit dem Befehl alle Zeilen von filenamebis hinzuzufügen , können Sie Folgendes tun:filename1sed

sed r filename1 filename

Beachten Sie jedoch, dass das Ergebnis leicht von der Ausgabe in Ihrer Frage abweicht, nämlich:

Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Jefferry 84     98     90
Cindy    11     22     54
Chester  48     12     84

Bearbeiten

Einige zusätzliche sedInformationen, die für diese Frage nützlich sind:

  • filenameNach der 4. Zeile hinzufügen filename1:

    sed '4 r filename' filename1

  • So fügen Sie filenamenach der Zeile, die mit „Dora“ beginnt, Folgendes hinzu filename1:

    sed '/^Dora/ r filename' filename1

  • So fügen Sie filenamenach der 4. Zeile Folgendes hinzu und entfernen alle Leerzeilen aus filename1:

    sed '/^$/d;4 r filename' filename1

Antwort2

Wenn ich mich recht erinnere, dürfte da keine Reihenfolge vorliegen.

In diesem Fall:

$ cat file2 file1 | column -t
Name      Class1  Class2  Class3
Lee       92      94      88
Chancy    91      85      95
Dora      99      77      96
Jefferry  84      98      90
Cindy     11      22      54
Chester   48      12      84

Antwort3

Wenn Sie tun:

sed r file1 file2

...dann wird versucht , an jede Eingabezeile der beiden benannten Eingabedateien sedeine ead-Datei mit einem Dateinamen der Länge Null anzuhängen, was jedoch fehlschlägt.rfile1Undfile2Dieser Befehl unterscheidet sich im Wesentlichen nicht von:

sed '' file1 file2

...außer dass res mit langsamer ist.

Das ist was ich meine:

seq 1  5 > file1
seq 6 10 > file2
strace sed r file[12]

...
write("1\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("2\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("3\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("4\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("5\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
read(3, "", 4096) = 0
close(3) = 0
open("file2", RDONLY) = 3
write("6\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("7\n", 21) = 2
...

Sehen Sie das open("" ...)Versagen mitENOENTjede Zeile befolgen? Das ist der leere read-Befehl sed, der ausgeführt wird. Sie bemerken die Fehler nicht, weil sedes so spezifiziert ist, dass es sich nicht über eine nicht vorhandene read-Datei beschwert, die in seinem Skript genannt wird, sondern so weitermacht, als ob nichts passiert wäre, wenn es versucht, reine zu lesen.

Und vielleichtsieht ausals ob es funktioniert, weil Sie nur eine Datei an das Ende einer anderen anhängen möchten - um catzwei Dateien zu verbinden - was sedstandardmäßig der Fall ist, wenn zwei Eingabedateien benannt sind - es liest die erste und dann die nächste. Aber wenn der read-Befehl wirklich funktionieren würde, würde die benannte read-Datei vollständig angehängt werdenjedenZeile im Eingang.

So was:

seq 3 > file
printf %s\\n a b c | 
sed r\ file

a
1
2
3
b
1
2
3
c
1
2
3

Um den Inhalt einer Datei an eine andere anzuhängen, haben Sie folgende Möglichkeiten:

cat < file2 >> file1

Um nur nach einer bestimmten Stelle in der Eingabe anzuhängen, haben Sie einige Optionen. sedDies ist eine davon:

sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1

... das sollte mit praktisch jedem funktionieren sed.

Oder wenn Sie ein POSIX haben sed:

{ sed /match/q; cat file2 -; } < file1

...was weitaus effizienter sein sollte.

Beide Methoden stellen sicher, dass der Inhalt vonfile2wird nur einmal und nur unmittelbar nach dem ersten Auftreten von in rausgelesenmatchfile1.

Ein anderer Weg könnte so aussehen:

cat file2 | sed /match/r\ /dev/fd/0 file1

...das nach jeder Übereinstimmung nach der ersten eine Datei mit der Länge Null auslesen würde...

verwandte Informationen