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 $VAR1
und $VAR2
in unser kurzes awk
Skript und dessen a
Variablen b
mithilfe -v
der Kommandozeile.
Innerhalb des Skripts iterieren wir über die Felder jeder Zeile, und wenn sich ein beliebiges Feld sowohl vom als auch vom Wert awk
unterscheidet , drucken wir die vollständige Zeile und fahren sofort mit der nächsten Zeile fort.a
b
a
Wenn 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...\E
Kontext einbetten.
$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp