
私のファイルは次のようになります:
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
、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
too で解決できます (おそらく、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