刪除值低於(或高於)閾值的行

刪除值低於(或高於)閾值的行

我的文件如下所示:

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 的行。我知道sedand的使用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

相關內容