しきい値を下回る(または上回る)行を削除する

しきい値を下回る(または上回る)行を削除する

私のファイルは次のようになります:

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 を含む行を削除したいと思います。 および の使用は認識していますがsedawk '$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


この問題のような特定の条件は、greptoo で解決できます (おそらく、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

関連情報