AWK: Wie entferne ich bestimmte Zeilen, die ein bestimmtes Muster NICHT enthalten?

AWK: Wie entferne ich bestimmte Zeilen, die ein bestimmtes Muster NICHT enthalten?

Ich habe eine Datei, die Zeilen mit verschiedenen alphanumerischen Zeichenfolgen enthält, die mit Leerzeichen-Bindestrich-Leerzeichen getrennt sind. Es gibt jedoch Zeilen, in denen nur ein alphanumerischer Wert und ein Trennzeichen vorhanden sind, der andere Zeichenfolgenwert jedoch fehlt. Beispiel:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
DK0060056323-DKK -
DK0060186294-DKK -

In den letzten beiden Zeilen im obigen Beispiel fehlt auf der rechten Seite des Trennzeichens eine alphanumerische Zeichenfolge, und ich möchte sie entfernen. Ich habe versucht, den folgenden awk-Ausdruck zu verwenden:

awk '!/* - /' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

Damit !/* - /meine ich „Suchen Sie nach einem Muster, bei dem nach jedem Zeichen (*) ein Leerzeichen-Bindestrich-Leerzeichen (-) und danach nichts folgt, und wenn kein solches Muster gefunden wird (!)“, verschieben Sie dann die restlichen Zeilen in die Datei temp.txt und ersetzen Sie den Inhalt von sourcefile.txt durch den Inhalt von temp.txt. Wenn ich jedoch das obige awk-Skript ausführe, passiert weder mit dem Inhalt von sourcefile.txt noch mit dem Inhalt von sourcefile.txt etwas – alles bleibt gleich. Ich erhalte auch keine Fehlermeldung. Was könnte hier falsch sein? Angesichts der obigen Beispielzeilen sollte die gewünschte Ausgabe nach dem Ausführen des awk-Skripts folgendermaßen aussehen:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

Antwort1

Um Zeilen zu drucken, die mit einem alphanumerischen Zeichen enden, gehen Sie einfach wie folgt vor:

$ awk '/[[:alnum:]]$/' file
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

Antwort2

Noch einfacher:

awk '$3' inputfile

Dies ist eine Abkürzung für awk '$3!=""', was eine Abkürzung für ist awk '$3!=""{print}', was eine Abkürzung für istawk '$3!=""{print $0}'

Fürs Protokoll:

sed /-$/dist wahrscheinlich schneller und grep -ve '-$'sogar noch schneller.

Antwort3

Dank des Vorschlags von @guillermo chamorro konnte ich das gewünschte Ergebnis erzielen, indem ich mein Skript folgendermaßen änderte:

awk '!/^.* -$/' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

Danke, Guillermo.

verwandte Informationen