%20dem%20Schwellenwert.png)
Meine Datei sieht folgendermaßen aus:
AA 110 B 10 .. BB 15 ... BBB 20 D F 25 D D
AA 111 B 50 .. BB 55 ... BBB 30 F F 45 F F
AA 112 C 2 .. BB 3 ... BBB 0 D F 0 D F
AA 120 D 2 .. FF 3 ... FFF 3 D F 3 D D
Ich möchte Zeilen löschen, die in einer der Spalten einen Wert =< 10 enthalten. Ich bin mir der Verwendung von sed
und bewusst awk '$3 !=< 10'
, aber dadurch würden nur Zeilen im dritten Feld gelöscht. Gibt es eine Möglichkeit, qwk anzuweisen, alle Spalten zu berücksichtigen?
Antwort1
perl
zur Rettung
$ cat ip.txt
AA 110 B 10 .. BB 15 ... BBB 20 D F 25 D D
AA 111 B 50 .. BB 55 ... BBB 30 F F 45 F F
AA 112 C 2 .. BB 3 ... BBB 0 D F 0 D F
AA 120 D 2 .. FF 3 ... FFF 3 D F 3 D D
$ perl -ae 'print if !(grep { $_ <= 10 && /^\d+$/ } @F)' ip.txt
AA 111 B 50 .. BB 55 ... BBB 30 F F 45 F F
-a
Eingabezeile bei Leerzeichen teilen und im@F
Array speicherngrep { $_ <= 10 && /^\d+$/ } @F
Holen Sie sich alle Elemente des@F
Arrays, die nur aus Ziffern bestehen und deren Wert ist<= 10
- dann drucke Zeilen aus, wenn grep zurückgibt
0
. Das()
„around“grep
bedeutet, dass es die Anzahl der Übereinstimmungen und nicht die Elemente selbst zurückgibt.
Lassen Sie uns eine andere Bedingung testen:
$ perl -ae 'print if !(grep { $_ < 10 && /^\d+$/ } @F)' ip.txt
AA 110 B 10 .. BB 15 ... BBB 20 D F 25 D D
AA 111 B 50 .. BB 55 ... BBB 30 F F 45 F F
Bestimmte Bedingungen, wie in dieser Frage, können grep
auch mit gelöst werden (was wahrscheinlich schneller ist als perl
die Lösung)
$ grep -vw '[0-9]\|10' ip.txt
AA 111 B 50 .. BB 55 ... BBB 30 F F 45 F F
$ grep -vw '[0-9]' ip.txt
AA 110 B 10 .. BB 15 ... BBB 20 D F 25 D D
AA 111 B 50 .. BB 55 ... BBB 30 F F 45 F F
-v
andere Zeilen als das mit dem Muster übereinstimmen-w
nur mit ganzen Wörtern übereinstimmen
Antwort2
In awk
können Sie etwas wie verwenden, for (i = 1 ; i <= NF ; i++) { ... }
um eine Schleife über alle Felder einer Zeile durchzuführen. Damit könnte etwa Folgendes passieren:
awk '{for(i = 1 ; i <= NF ; i++) {
if ($i ~ /^[0-9]+$/ && $i <= 10) { next };
}
} 1' < input
$i ~ /^[0-9]+$/
prüft, ob das Feld nur Ziffern enthält, und vergleicht es dann mit . Wenn es kleiner oder gleich 10 ist, wird 10
zum Datensatz (Zeile) gewechselt .next
Antwort3
das ist für sed
sed -rn '/\b([0-9]|10)\b/!p' file