Führen Sie alternative Zeilen aus zwei Dateien zusammen

9

Datei1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

Datei2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

Ausgabedatei:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323
pmaipmui
quelle
2
Bitte geben Sie immer Ihr Betriebssystem an. Viele der Standardtools verhalten sich auf den verschiedenen Betriebssystemen unterschiedlich, daher müssen wir wissen, was Sie verwenden.
Terdon

Antworten:

23

Verwenden von paste:

paste -d \\n file2 file1
Stephen Kitt
quelle
5

Eine weitere awk-Lösung:

awk '{print; getline < "file1"; print}' file2
Glenn Jackman
quelle
5

Die pasteLösung ist die tragbarste und effizienteste. Ich erwähne diese Alternative nur, wenn Sie ihr Verhalten bevorzugen, wenn die beiden Dateien nicht die gleiche Anzahl von Zeilen haben:

Mit GNU sed:

sed Rfile1 file2

Wenn file1weniger Zeilen als vorhanden sind file2, wird bei file1Erschöpfung sednichts dafür ausgegeben (im Gegensatz zu leeren Zeilen für paste).

Wenn file1mehr Zeilen als vorhanden sind file2, werden diese zusätzlichen Zeilen verworfen (im Gegensatz zum Drucken leerer Zeilen für file2mit paste).

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2
Stéphane Chazelas
quelle
4

Mit awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNRwird nur abgeglichen, wenn die aktuelle Datensatznummer der aktuellen Dateidatensatznummer entspricht (daher wird sie nur während der Verarbeitung der ersten Datei abgeglichen): Speichert den aktuell verarbeiteten Datensatz im Array xan einem Index, der der aktuellen Dateidatensatznummer entspricht, und überspringt den derzeitiger Rekord
  • {print x[FNR]"\n"$0}: Gibt den Inhalt des Arrays xin einem Index aus, der der aktuellen Dateidatensatznummer entspricht, gefolgt von einer neuen Zeile und dem Inhalt des aktuellen Datensatzes
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323
kos
quelle
Es gibt die Ausgabe, aber nicht genau das, was ich wollte. tid.info-Zeilen kommen nach tid.setnr-Zeilen in meiner Ausgabedatei.
Pmaipmui
@Nainita Das zeigen Sie in Ihrer Beispielausgabe.
Kos
@Nainita Wie auch immer, um die Reihenfolge der Ausgabe zu ändern, können Sie einfach file1und file2im Befehl wechseln .
Kos
Ja ... ich habe das gleiche getan, aber es wurde genau wie zuvor gedruckt. Nach dem Drucken von tid.setnr wurde tid.info angezeigt.
Pmaipmui
1
@mikeserv Aber seit ich dabei war, habe ich es mawkauch versucht und es läuft auch darauf. Wie auch immer vernünftig zu sein Ich kann nicht sehen , warum es nicht funktionieren soll nur umgekehrt (dh nur von Dateien Schalten). Es ist nicht so awkwichtig für die Eingabe, Linien sind Linien. Wenn etwas von seiner Version nicht unterstützt worden wäre, wäre es beim ersten Mal kaputt gegangen. Viel einfacher, einfach OP hat einen Fehler beim Wechseln der Eingabedateien in den Argumenten gemacht.
Kos
-1

Die einfachste Lösung ist unten angegeben.

cat file1 >> file2

oder

cat file2 >> file1
Sachin
quelle
1
Sachin, lies die Frage noch einmal; Dadurch wird der Inhalt einer Datei an den Inhalt einer anderen Datei angehängt. Es werden nicht die Dateien zusammengeführt, die die Zeilen abwechseln (also eine Zeile von file1dann eine Zeile von file2und so weiter ...)
don_crissti