Entfernen Sie die gesamte Zeile nur, wenn jede Spalte darin entweder $VAR1 oder $VAR2 ist.

Entfernen Sie die gesamte Zeile nur, wenn jede Spalte darin entweder $VAR1 oder $VAR2 ist.

Ich habe eine Textdatei, in der die Spalten- und Zeilennummern immer unterschiedlich sind, und möchte ganze Zeilen nur dann aus der TXT-Datei entfernen, wenn jede Spalte darin entweder $VAR1 oder $VAR2 entspricht. Beispiel:

Nehmen wir an, $VAR1="X" und $VAR2="N" und ich möchte alle Zeilen entfernen, in denen $VAR1 und $VAR2 die gesamte Spalte bilden.

Das wäre mein Input:

hajn 32 ahnnd namm 5 543 asfn F
X X N X X X N X
5739 dw 32eff Sfff 3 asd 3123 1

Und das wäre meine gewünschte Ausgabe:

hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1

Ich kann dies mit einer Schleife lösen, aber ich frage mich, ob es dafür eine leistungsfähigere Methode mit einer Zeile gibt, vorzugsweise mit awk.

Antwort1

$ VAR1=N
$ VAR2=X
$ awk -v a="$VAR1" -v b="$VAR2" '{ for (i=1; i<=NF; ++i) if ($i != a && $i != b) { print; next } }' file
hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1

Hier übertragen wir die Werte $VAR1und $VAR2in unser kurzes awkSkript und dessen aVariablen bmithilfe -vder Kommandozeile.

Innerhalb des Skripts iterieren wir über die Felder jeder Zeile, und wenn sich ein beliebiges Feld sowohl vom als auch vom Wert awkunterscheidet , drucken wir die vollständige Zeile und fahren sofort mit der nächsten Zeile fort.ab

aWenn sich kein Feld von und unterscheidet b, passiert nichts (die Zeile wird nicht gedruckt).

Antwort2

Mit der richtigen Wahl des regulären Ausdrucks können Sie die gewünschten Ergebnisse herausfiltern. Hinweis: Vorausgesetzt, die Shell-Variablen haben leere Zeichen, also solche, die nicht als spezielle reguläre Ausdrücke interpretiert werden können. Falls dies nicht zutrifft, können Sie die Variablen in einen \Q...\EKontext einbetten.

$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp

verwandte Informationen