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 awk
ordnungsgemäß bei valueA:valueB
und entfernt die Zeile (deshalb bin ich mir nicht sicher, was Sie mit "scheint zu passen" meinenvalueD:valueE
valueC:
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 awk
wie folgt codiert werden:
awk -F : '! ( $1=="" || $2=="" )'
Die Aufgabe entspricht „nur Zeilen drucken, bei denen keine Spalte leer ist“:
awk -F : '$1!="" && $2!=""'
Note awk
ist 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 awk
anderen. Seine Form spiegelt jedoch nicht direkt den Kern des Problems wider. Obwohl mir sein Minimalismus ästhetisch gefällt, denke ich dennoch, dass es awk
das Richtige ist.
Antwort2
Mit sed und drei s
Befehlen:
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.