2017-02-12 12 views
0

Ich möchte den Text aus File2 in File1Wie füge ich Text in leere Zeilen ein?

File1 einzufügen:

1 
2 

4 
5 

7 
8 

File2:

3 
6 

Ausgang:

1 
2 
3 
4 
5 
6 
7 
8 

Als Beispiel Versuch, aus dieser Frage Insert text into blank lines in bash:

sed -e '/^$/{R file2' -e 'd}' file1 

Aber es funktioniert nur, wenn nur jede zweite Zeile leer ist. Ich würde gerne fragen, ist es in komplexeren Fällen möglich? Mit anderen Worten, gibt es eine universelle Lösung?

Als Beispiel:

File1

1 
2 
3 

5 
6 


9 

File2

4 
7 
8 

Ausgabe

1 
2 
3 
4 
5 
6 
7 
8 
9 
+2

Benutzung von GNU sed Ihr sed-Skript für mich im zweiten Beispiel funktioniert gut, nachdem darauf geachtet, dass '' File1' und File2' Ende mit einem einzelnen Zeilenumbruch. Zum Beispiel: Achten Sie darauf, Return einmal nach der "8" und der "9" zu drücken. –

+0

Mit einer 'universellen Lösung' meinst du 1) nimm zwei Dateien, 2) kombiniere, 3) sortiere 4) eliminiere Leerzeichen? Sie können 'cat f1 f2 | sortieren | grep .' – dawg

Antwort

3

Sie dieses awk Skript ausprobieren können:

script.awk

FNR == NR { repl[ ++i ] = $0; next; } 
NF == 0 { print repl[ ++j ]; next; } 
1 

Run es wie folgt aus: awk -f script.awk File2 File1.

Erklärung

  • Die erste Zeile mit der Bedingung FNR == NR nur dann ausgeführt wird, während die erste Datei als Argument zu lesen. Hier ist es File2. Es speichert die Ersatzzeile in repl und liest die nächste Zeile aus File2, aufgrund next Anweisung.
  • Die zweite und dritte Zeile werden für die zweite als Argument angegebene Datei ausgeführt, hier ist es File1.
    • Die Bedingung NF == 0 für Leerzeilen wahr ist und druckt die nächste verfügbare Ersatzzeile von repl, dann die nächste Zeile von File1 liest
    • Die 1 ist für nicht leere Zeilen aus File1 excuted und es ist eine Abkürzung zum Drucken der Linie.
+1

@EdMorton Ich aktualisierte das Skript, danke für die Beratung. –

1

Einfach für jeden Fall mit Perl einem lnier

Wenn Sie Ihren file_2 in eine Datei ändern, ohne Newline es ein einfacher Job zu tun.

enter image description here


$ cat file_1 
1 
2 
3 

5 
6 


9 
$ cat file_2 
3 7 8 
$ 
$ perl -ale '@[email protected] if $.==1; print (/\d+/ ? @F : shift @file2) if $.!= 1' file_2 file_1 
1 
2 
3 
3 
5 
6 
7 
8 
9 

, wie es funktioniert

Der Hauptteil ist hier:
print (/\d+/ ? @F : shift @file2)
, dass es die file2 erscheint, wenn die Linie nicht eine beliebige Ziffer überein . das ist es.
Sie können auch die @F zu _ $ ändern
print (/\d+/ ? $_ : shift @file2)

2

Hier ist eine mit awk und getline:

$ awk 'NF==0{ getline < "file2" }1' file1 
1 
2 
3 
4 
5 
6 
7 
8 

9 

zusätzliche leere Zeile ist ein Test mit mehr Lücken in file1 da sind Werte in file2.

+0

das könnte eine gute Verwendung von 'getline' sein. '! NF 'wird kürzer sein. – karakfa

0

Warum nicht einfach ein Array füllen und dann die Indizes geliefert ausdrucken:

awk 'NF{a[$1]}END{for(i in a)print i}' file1 file2 
+0

weil die Werte nicht in der Reihenfolge read/willed gedruckt werden, werden die Werte aus beiden Dateien in zufälliger (Hash-) Reihenfolge gedruckt. Sie können auch einfach 'awk' NF 'file1 file2' machen. –

+0

Nein ... Ihre Lösung würde sie in der Reihenfolge ausgeben, in der sie in den Dateien erscheinen. Mine zeigt sie in numerischer Reihenfolge an. – grail

+0

Nein wird es nicht, Sie können über den 'in' Operator unter https://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array lesen:' Die Reihenfolge, in der Elemente der Auf Array wird durch diese Anweisung zugegriffen, die durch die interne Anordnung der Array-Elemente innerhalb awk' bestimmt ist. Mit anderen Worten, die Reihenfolge, in der sie aufgerufen werden, ist die Reihenfolge, in der sie in den Hashtabellen gespeichert sind, die für alle Absichten als zufällig betrachtet werden können. –

Verwandte Themen