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

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

ähnlich der Frage „Entfernen Sie die gesamte Zeile nur, wenn jede Spalte darin entweder $VAR1 oder $VAR2 ist“

ABER es geht stattdessen darum, eine ganze SPALTE zu entfernen, und basiert auf der Zusammensetzung jeder ZEILE in der Spalte

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

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

Das wäre mein Input:

hajn 32 ahnnd namm X 543 asfn F
namd 90 jsnfu namm X 098 asfn S
5739 dw 32eff Sfff N asd 3123 1

Und das wäre meine gewünschte Ausgabe:

hajn 32 ahnnd namm 543 asfn F
namd 90 jsnfu namm 098 asfn S
5739 dw 32eff Sfff 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

Schauen Sie sich das an.

$ cat data
hajn 32 ahnnd namm X 543 asfn F
namd 90 jsnfu namm X 098 asfn S
5739 dw 32eff Sfff N asd 3123 1

Verwenden Sie awk mit einem if-Ausdruck und einem or-Ausdruck ||darin. Wenn ja, schließen Sie Spalte Nr. 5 aus und drucken Sie die restlichen Daten aus.

$ awk '{ if ($5=="X" || $5=="N") { $5=""; print } }' < data
hajn 32 ahnnd namm  543 asfn F
namd 90 jsnfu namm  098 asfn S
5739 dw 32eff Sfff  asd 3123 1

Antwort2

Habe es mit der folgenden Methode versucht und es hat auch gut funktioniert

VAR1="X"
VAR2="N"

Count_of_columns=`awk '{print NF}' filename| sort -nr| sed -n '$p'` 

for((i=1;i<=$Count_of_columns;i++)); do awk -v i="$i" -v VAR1="$VAR1" -v VAR2="$VAR2" '$i == VAR1||$i == VAR2{$i="";print $0}' filename; done

Ausgabe

hajn 32 ahnnd namm  543 asfn F
namd 90 jsnfu namm  098 asfn S
5739 dw 32eff Sfff  asd 3123 1

Antwort3

Sie müssen die Zeilen speichern, da die Entscheidung zum Löschen einer Spalte erst getroffen werden kann, nachdem die letzte Zeile untersucht wurde.

$ perl -lane '
    push @{$A[$.]}, @F;my $i;
    $h[$i++] ||= !/X/ && !/N/ for @F}{
    my @I2P = grep { $h[$_] } 0 .. $#h;
    print join $", @{$A[$_]}[@I2P] for 1 ..  $#A;
' inp

verwandte Informationen