Wie entfernt man einen ganzen Eintrag, der ein Muster enthält?

Wie entfernt man einen ganzen Eintrag, der ein Muster enthält?

Ich habe mehrere Dateien mit dem folgenden Format:

Num  name1  name2  value

So sieht beispielsweise die Datei mit dem Namen in1.sp folgendermaßen aus:

 C1    in1    out1        3.9e-12
 C2    foo    st1/in1     1.2e-14
 C3    foo2   in1         8.3e-14
 ...

und so weiter. In allen Zeilen enthält eine der Namensspalten den Dateinamen. Ich möchte den gesamten Eintrag entfernen, wenn er den Dateinamen enthält, auch wenn anderer Text vorhanden ist. Wenn also oben die Eingabe ist, wäre die gewünschte Ausgabe:

 C1    out1    3.9e-12
 C2    foo     1.2e-14
 C3    foo2    8.3e-14
 ...

Danke!

Antwort1

Wenn ich dich auch richtig verstehe, probier mal folgendes

for f in *.sp; do 
  sed "s/[^ ]*${f%.*}[^ ]*//" "$f" | column -t
done

Ausgabe:

C1  out1    3.9e-12
C2  foo     1.2e-14
C3  foo2    8.3e-14

Antwort2

Wenn ich Sie richtig verstehe, möchten Sie alle Feldwerte entfernen, die eine Übereinstimmung mit dem Dateinamen (abzüglich der Erweiterung) enthalten.

Wenn ja, könnten Sie eine feldweise Untersuchung durchführen grepin perl:

$ cat in1.sp 
 C1    in1    out1        3.9e-12
 C2    foo    st1/in1     1.2e-14
 C3    foo2   in1         8.3e-14

Dann

$ perl -alpe '$_ = join "\t", grep { $_ !~ (split(/\./,$ARGV))[0] } @F' in1.sp 
C1  out1  3.9e-12
C2  foo   1.2e-14
C3  foo2  8.3e-14

Antwort3

Mit können Sie awkdie gewünschten Spalten auswählen

$ awk '{print $1 "\t" $2 "\t" $4}' in1.sp 
C1  in1 3.9e-12
C2  foo 1.2e-14
C3  foo2    8.3e-14

Dies funktioniert, solange garantiert ist, dass die Felder in den Spalten nicht leer sind und keine Leerzeichen enthalten.

verwandte Informationen