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

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:




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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.