2016-03-29 6 views
-1

Ich bin ein neuer Linux-Benutzer und ich habe immer noch nicht herausgefunden, wie man es benutzt, löste das Problem auf sehr hässliche Weise, aber ich bin sicher, dass es durch eine clevere Verwendung von sed oder awk gelöst werden kann. Problem ist ein wenig schwer zu erklären, aber es geht darum, wie zwei Textdateien, die durch bestimmte Regeln formatiert sind, zu überlappen.Überlappung von zwei Dateien in Linux oder entsprechenden Ersatz von Zeilen aus Datei1 mit Zeilen aus Datei2

Problem 1:

Regeln: file1 hat einige Zeilen, die gleich der Zeichenfolge „custom“, diese Linien durch die Linien ersetzt werden, die jeweils in file2 existieren, so erstmals „custom“ tritt in file1, erste Zeile von file2 wird statt Linie gesetzt werden, die „custom“ in file2, zum zweiten Mal „custom“ in file1 kommt es durch die zweite Linie von file2 usw. auch Anzahl der Vorkommen von „custom“ Linien ersetzt braucht werden mußten in file1 entspricht der Anzahl der Zeilen in file2.

Beispiel:

File1:

line1 
line2 
custom 
line4 
custom 
line6 

File2:

line3 
line5 

output:

line1 
line2 
line3 
line4 
line5 
line6 

Eine Möglichkeit, dieses zu lösen i s vielleicht nach ersten Auftreten von custom suchen, ersetzen Sie es durch die erste Zeile in file2, löschen Sie die erste Zeile von file2, suchen Sie nach dem nächsten Auftreten von benutzerdefinierten, nehmen Sie die erste Zeile in file2, löschen Sie es und so weiter. Ich bin mir sicher, dass viel besser mit sed/grep/awk existiert.

Problem 2:

Benutzer des Codes muss tatsächlich file2 angeben, wie ich ihm sagen, vielleicht, wenn das Problem wie folgt formuliert wurde, es wäre einfacher zu lösen sein:

Dies sind die Regeln: Sowohl Datei1 als auch Datei2 haben jetzt die gleiche Anzahl von Zeilen. Einige der Zeilen in Datei1 entsprechen der Zeichenfolge "custom" wie im vorherigen Problem. Datei2 enthält leere Zeilen an Stellen, an denen Zeilen in Datei1 nicht mit "Benutzerdefiniert" übereinstimmen. Daher möchte ich Datei2 über Datei1 einfügen und nur Zeilen mit "Benutzerdefiniert" überschreiben.

Datei 1 wie folgt aussieht:

line1       
custom 
line3 
custom 
line5 

Datei 2:

/n 
line2 
/n 
line4 
/n 

/n steht für leere Zeile, ausgegeben wird

line1 
line2 
line3 
line4 
line5 

Auch würde ich gerne Ausgang der Lösung, um Datei1 zu überschreiben (Ich denke, ich kann es tun, indem solution >> file1)

Ich möchte Lösungen für beide Probleme und Erklärung, was die Befehle, die Sie verwendeten, tatsächlich getan haben.

Ich habe eigentlich nur 1-3 Zeilen in der Datei1 für die aktuelle Version des Codes, also löste ich das Problem mit vielen von if-else Szenarien durch Überschrift und tailing Zeilen in Datei2, aber ich bin sicher, etwas eleganter ist möglich.

BONUS Frage:

ich zunächst Inhalt der Zeilen in file1 als separate Variablen ($line1, $line2 etc.) und fast löste das Problem mit awk, gespeichert, aber es wollte nicht $var akzeptieren, weil die die '' zitiert, und es hat auch nicht mit "" zitiert. Ich sah, dass sed kann mächtige Dinge tun, aber kann es mit Muster in String Variable gespeichert ausgeführt werden? Ich habe versucht, sed mit "" und $var funktioniert, aber wird es immer funktionieren? Ich habe das gleiche mit Awk versucht und es ist kaputt gegangen.

+1

Bitte zeigen Sie, was Sie – Vasfed

+0

versucht haben ** und gelöst fast das Problem mit awk **: Können Sie zeigen Sie Ihre Lösung in Frage – anubhava

+0

Sollte das zweite Beispiel nicht zwei 'line3' Linien haben? – 123

Antwort

0

awk zur Rettung!

für das erste Problem, hier ist eine einfache Lösung mit getline, allgemein als gefährlich, aber wenn Sie gegen die Nebenwirkungen immun sind, gibt es keinen Schaden.

$ awk '/custom/{getline < "file2"; print; next} 1' file1 

line1 
line2 
line3 
line4 
line5 
line6 

für den zweiten Fall, könnte es einfacher sein, die Dateien mit einigen nicht verwendeten Zeichen zu kombinieren und dann awk lassen, die richtige Wahl wählen.

$ paste -d~ file2 file1 | awk -F~ '{print $1==""?$2:$1}' 

line1 
line2 
line3 
line3 
line4 
+1

Es funktioniert perfekt, Sie haben nur 39 Zeilen in meinem Code auf eine Zeile reduziert. Ich habe die ganze Nacht lang ewig nach der Lösung gegoogelt. Vielen Dank :) –

+0

Können Sie bitte überprüfen, ob Sie eine elegante Antwort auf andere Fragen haben, die ich gepostet habe (36317896). Ich erkannte, dass ich Datei1 von diesem Problem nicht richtig gemacht habe. –

Verwandte Themen