删除值低于(或高于)阈值的行

AP3*_*P38 4 sed awk delete

我的文件看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

我想删除任何列中包含值 =< 10 的行。我知道使用sedandawk '$3 !=< 10'但这只会删除第三个字段中的行。有没有办法告诉 qwk 考虑所有列?

Sun*_*eep 7

perl 救援

$ 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
Run Code Online (Sandbox Code Playgroud)
  • -a在空间上拆分输入行并保存到@F数组
  • grep { $_ <= 10 && /^\d+$/ } @F获取@F数组中仅由数字组成且值为<= 10
  • 如果 grep 返回,则打印行0。在()周围grep,它返回的匹配,而不是元素本身的数

让我们测试另一个条件:

$ 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
Run Code Online (Sandbox Code Playgroud)


某些条件,如在这个问题中,也可以解决grep(这可能比perl解决方案更快)

$ 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
Run Code Online (Sandbox Code Playgroud)
  • -v 匹配模式以外的行
  • -w 只匹配整个单词


ilk*_*chu 7

在 中awk,您可以使用类似for (i = 1 ; i <= NF ; i++) { ... }循环遍历一行中的所有字段。有了这个,就像:

awk '{for(i = 1 ; i <= NF ; i++) { 
         if ($i ~ /^[0-9]+$/ && $i <= 10) { next };
       } 
     } 1'  < input
Run Code Online (Sandbox Code Playgroud)

$i ~ /^[0-9]+$/检查该字段是否仅为数字,然后将其与 进行比较10next如果小于或等于 10 ,则移至记录(行)。