ä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