私のファイルは次のとおりです。
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'
これは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