Entfernen Sie Zeilen, in denen eine der Spalten leer ist.

Entfernen Sie Zeilen, in denen eine der Spalten leer ist.

Ich habe eine große, durch Doppelpunkte getrennte Textdatei mit zwei Spalten wie diesen:

valueA:valueB
valueC:
valueD:valueE
:valueG

Wenn links keine Daten vorhanden sindoderrechts vom Doppelpunkt möchte ich die ganze Zeile entfernen:

valueA:valueB
valueD:valueE

Wie würde ich dabei vorgehen?

Das Nächstliegende, was mir einfällt, ist etwa:

awk -F : '$2!=""' file > final_output

Aber dies scheint mit allem übereinzustimmen, unabhängig davon, ob die Zeile eine leere Spalte enthält oder nicht.

Antwort1

Ihr Befehl behält die Beispielzeilen awkordnungsgemäß bei valueA:valueBund entfernt die Zeile (deshalb bin ich mir nicht sicher, was Sie mit "scheint zu passen" meinenvalueD:valueEvalueC:alles").

Der Befehl bleibt bestehen :valueG, weil Sie das erste Feld überhaupt nicht testen.

„Keine Zeilen drucken, bei denen eine der beiden Spalten leer ist“ kann awkwie folgt codiert werden:

awk -F : '! ( $1=="" || $2=="" )'

Die Aufgabe entspricht „nur Zeilen drucken, bei denen keine Spalte leer ist“:

awk -F : '$1!="" && $2!=""'

Note awkist ein Tool, das sich sehr gut zur Lösung des Problems eignet. Unsere beiden Zeilen spiegeln die gewünschte Logik in Bezug auf „Trennzeichen“ ( -F :), „Spalten“/„Felder“ ( $1, $2), „Leersein“ ( …=="") usw. wider. Es mag Lösungen mit anderen Tools geben, aber deren Funktionsweise wird die Logik nicht unbedingt so klar zum Ausdruck bringen. Zum Beispiel mit grep:

grep '.:.'

Der obige Befehl funktioniert einwandfrei und ist einfacher als die awkanderen. Seine Form spiegelt jedoch nicht direkt den Kern des Problems wider. Obwohl mir sein Minimalismus ästhetisch gefällt, denke ich dennoch, dass es awkdas Richtige ist.

Antwort2

Mit sed und drei sBefehlen:

sed 'N; s/\n:/:/; s/\n/:/; s/:$//' file

Ausgabe:

WertA:WertB:WertC
WertD:WertE:WertG

Aus man sed:

N: Fügt die nächste Eingabezeile in den Musterbereich ein.

verwandte Informationen