我的文件看起来像这样:
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 的行。我知道使用sed
andawk '$3 !=< 10'
但这只会删除第三个字段中的行。有没有办法告诉 qwk 考虑所有列?
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
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
只匹配整个单词在 中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]+$/
检查该字段是否仅为数字,然后将其与 进行比较10
,next
如果小于或等于 10 ,则移至记录(行)。