Grep для диапазона чисел

Я столкнулся с таким же поведением. После изучения документации выяснилось, что это известная проблема :

.

Note, however that the one page per file feature may not supported by all devices. Also, since some devices write output files when opened, there may be an extra blank page written (pdfwrite, ps2write, eps2write, pxlmono, pxlcolor,...).

-1
08.03.2021, 19:46
4 ответа

Попробуйте это:

grep -E '[^0-9](3[0-9][0-9]|4[01][0-9]|42[0-5])-' file`
  • -Eвключает расширенные регулярные выражения (, где вам не нужно использовать обратную косую черту в круглых скобках и вертикальную черту)
  • [^0-9](--не -цифра, за которой следует
    • 3[0-9][0-9]|число от 300 до 399 или
    • 4[01][0-9]|число от 400 до 419 или
    • 42[0-5]число от 420 до 425
  • )-после дефиса

Предоставление требования к цифре, отличной от -, означает, что вы не соответствуетеABC1234-Something

2
18.03.2021, 22:26

Использованиеawk:

awk -F'(^| )...|-' '$2>300 && $2<425 || $4>300 && $4<425' infile

здесь мы устанавливаем разделитель полей на:

  • начало строки, за которым следуют 3 символа ^...или
  • пробел, за которым следуют 3 символа ..., или
  • символ дефиса

, затем на их основе столбец #2 и столбец #4 будут остатками аминокислот, и поэтому мы проверяем, находится ли он в заданном диапазоне.

5
18.03.2021, 22:26

Инструменты, которые в основном работают с регулярными выражениями, печально известны своей плохой работой с числами. В этом случае я бы предложил использовать что-то вроде awkвместоgrep:

$ awk '{ r1 = substr($1,4,3); r2 = substr($2,4,3) } (r1 >= 300 && r1 <= 425) || (r2 >= 300 && r2 <= 425)' file
ARG262-Side ASP368-Side 140,83%
LEU354-Main LYS365-Main 93,6%
ARG346-Side GLU263-Side 93,57%
LEU301-Main ALA247-Main 93,43%
TYR424-Side ASN446-Main 93%

Код awkизвлекает символы дерева, начиная со смещения четыре, из первых двух полей, разделенных пробелами -в каждой строке, и вызывает их r1и r2. Я использую substr()для извлечения чисел в фиксированных позициях в данных полей, но вы также можете просто удалить все цифры, отличные от -, если вы уверены, что единственные цифры — это те, которые вам нужны. интересно. Вы бы сделали это с

r1 = $1; gsub("[^[:digit:]]", "", r1)

и аналогично для r2с использованием $2.

Если условие в конце истинно, будет напечатана текущая строка.

5
18.03.2021, 22:26
grep -E "(^[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5]))|\b[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5])))" sample.txt

grep -Eс расширенным регулярным выражением.

^[[:upper:]]{3}:Если строка начинается с трех букв верхнего алфавита

3[0-9]{2}:Соответствует любой последовательности цифр больше или равной 300

|:или

4([0-1][0-9]|2[0-5]):между 400 и 425.

|:Или (здесь посмотрите на вторую колонку)

\b:Мир есть границы (Есть пространство)

[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5])):То же, что и в первом пути.

0
18.03.2021, 22:26

Теги

Похожие вопросы