Ich habe eine durch Tabulatoren getrennte Datei, die folgendermaßen aussieht:
gene v1 v2 v3 v4
g1 NA NA NA NA
g2 NA NA 2 3
g3 NA NA NA NA
g4 1 2 3 2
Die Anzahl der Felder in jeder Zeile ist fest und gleich. Ich möchte diese Zeilen aus der obigen Datei entfernen, in der alle Felder für jede Zeile von Spalte 2 bis zuletzt NA sind. Dann sollte die Ausgabe folgendermaßen aussehen:
gene v1 v2 v3 v4
g2 NA NA 2 3
g4 1 2 3 2
text-processing
awk
perl
bioinformatics
user3138373
quelle
quelle
\s\d
zwischen den Zeilen „gut“ und „schlecht“.is.na
,Antworten:
Mit
awk
:Durchlaufen Sie die Felder ab dem zweiten Feld und drucken Sie die Zeile, wenn ein Feld gefunden wird, das keine enthält
NA
. Dann brechen Sie die Schleife.quelle
Mit GNU sed
Kurze Erklärung:
g[0-9]\+\(\s*NA\s*\)\+$
ist eine Regex-Übereinstimmung,g
gefolgt von mindestens einer Ziffer, dann einer beliebigen Anzahl vonNA
s mit optionalen Leerzeichen zwischen bis zum Ende der Zeile.sed -e '/<regex>/d'
löscht alle übereinstimmenden Zeilen<regex>
Ein Standard-Regexp mit derselben Bedeutung wäre:
quelle
\+
und\s
nicht standardmäßige reguläre Ausdrücke sind und mit einer einfachen+
oders
in den meistensed
Versionen übereinstimmen . Verwenden Sie\{1,\}
anstelle von\+
und[[:space:]]
anstelle von\s
portablem Code.Mit
all
aus dem Perl List :: Util-Modul:quelle
Mit
grep
:Dies führt dazu, dass grep keine (
-v
) Zeilen anzeigt , in denen die gesamte Zeile (-x
) übereinstimmt:quelle
{4}
anstatt*
nach derNA
Gruppe, und Sie können die erste ändern möchten[[:blank:]]*
zu[[:blank:]]+
machen , um die Leerzeichen Separatoren obligatorisch. Unabhängig davon habe ich nie verstanden, warum jeder darauf besteht, dieawk
Panzerfaust herauszuziehen , um diese einfachen Filterprobleme zu lösen,grep
die leicht zu handhaben sind.*
damit diese Lösung für eine beliebige Anzahl vonNA
Spalten gleich gut funktioniert , solange sie alle NA sind.Du könntest es versuchen:
quelle