
我的文件如下所示:
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
我想刪除任何列中包含值 =< 10 的行。我知道sed
and的使用awk '$3 !=< 10'
,但這只會刪除第三個字段中的行。有沒有辦法告訴 qwk 考慮所有列?
答案1
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
-a
在空間上分割輸入行並儲存到@F
陣列grep { $_ <= 10 && /^\d+$/ } @F
獲取@F
數組中僅由數字組成且值為<= 10
- 然後如果 grep 返回則列印行
0
。 around()
意味著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
某些條件,例如這個問題,也可以解決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
-v
匹配圖案以外的線條-w
僅匹配整個單字
答案2
在 中awk
,您可以使用類似for (i = 1 ; i <= NF ; i++) { ... }
迴圈遍歷一行上的所有欄位的方法。這樣,就像:
awk '{for(i = 1 ; i <= NF ; i++) {
if ($i ~ /^[0-9]+$/ && $i <= 10) { next };
}
} 1' < input
$i ~ /^[0-9]+$/
檢查該欄位是否僅為數字,然後與 進行比較,如果小於或等於 10,則10
移至記錄(行)。next
答案3
這是用於 sed 的
sed -rn '/\b([0-9]|10)\b/!p' file