しきい値より低い(または高い)値を持つ行の削除

しきい値より低い(または高い)値を持つ行の削除

私のファイルは次のとおりです。

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'これは3番目のフィールドの行だけを削除します。すべての列を考慮するように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以下の場合は10レコード(行)に移動します。next

答え3

これはsed用です。

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

関連情報