Löschen Sie Zeilen mit einem Wert unter (oder über) dem Schwellenwert

Löschen Sie Zeilen mit einem Wert unter (oder über) dem Schwellenwert

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 sedund 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

perlzur 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
  • -aEingabezeile bei Leerzeichen teilen und im @FArray speichern
  • grep { $_ <= 10 && /^\d+$/ } @FHolen Sie sich alle Elemente des @FArrays, die nur aus Ziffern bestehen und deren Wert ist<= 10
  • dann drucke Zeilen aus, wenn grep zurückgibt 0. Das ()„around“ grepbedeutet, 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 grepauch mit gelöst werden (was wahrscheinlich schneller ist als perldie 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
  • -vandere Zeilen als das mit dem Muster übereinstimmen
  • -wnur mit ganzen Wörtern übereinstimmen

Antwort2

In awkkö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 10zum Datensatz (Zeile) gewechselt .next

Antwort3

das ist für sed

sed -rn '/\b([0-9]|10)\b/!p' file

verwandte Informationen