Задать вопрос
@lemonlimelike

Как вывести нужные строки через grep?

Всем привет! Тренируюсь использовать grep, нашел пару задач. Не получается вывести правильные строки.
Вот сам файл 5eba85de1b412549953319.png
Вот структура: 5eba869c9204f962925509.png
Вот текстом:
7954 JAMES     T MURRAY    CLERC       SALES      DALLAS   750
7950 ALICE     B JENSEN    CLERC       SALES      NEW-YORK 750
7934 BARBARA   M MILLER    CLERC       ACCOUNTING NEW-YORK 1300
7919 MICHAEL   A DOUGLAS   CLERC       RESEARCH   NEW-YORK 800
7916 GRACE     M ROBERTS   ANALYST     RESEARCH   NEW-YORK 2875
7900 FRED      S JAMES     CLERC       SALES      CHICAGO  950
7698 MARION    S BLAKE     MANAGER     SALES      CHICAGO  2850
7676 DENISE    D SOMMERS   STAFF       OPERATIONS CHICAGO  1850
7654 KENNETH   J MARTIN    SALESPERSON SALES      CHICAGO  1250
7609 RICHARD   M LEVIS     STAFF       OPERATION  DALLAS   1800
7600 RAYMOND   Y PORTER    SALESPERSON SALES      NEW-YORK 1250
7569 CHRIS     L ALBERTS   MANAGER     RESEARCH   NEW-YORK 3000
7566 TERRY     M JONES     MANAGER     RESEARCH   DALLAS   2985
7564 GREGORY   J LANGE     SALESPERSON SALES      DALLAS   1250
7560 SARAH     S DUNCAN    SALESPERSON SALES      DALLAS   1250
7557 KAREN     P SHAW      SALESPERSON SALES      NEW-YORK 1250
7555 DANIEL    T PETRS     SALESPERSON SALES      NEW-YORK 1250
7369 JONH      Q SMITY     CLERK       RESEARCH   DALLAS   800
7499 KEVIN     J ALLEN     SALESPERSON SALES      CHICAGO  1600
7505 JEAN      K DOYLE     MANAGER     SALES      NEW-YORK 2800
7506 LYNN      S DENNIS    MANAGER     SALES      DALLAS   2750
7507 LESLIE    D BAKER     MANAGER     OPERATION  NEW-YORK 2200
7521 CYNTHIA   D WARD      SALESPERSON SALES      CHICAGO  1250
7782 CAROL     F CLARK     MANAGER     ACCOUNTING NEW-YORK 2450
7788 DONALD    T SCOTT     ANALYST     RESEARCH   DALLAS   3000
7789 LIVIA     N WEST      SALESPERSON SALES      DALLAS   1300
7799 MATTHEW   G FISHER    ANALYST     RESEARCH   NEW-YORK 3000
7820 PAUL      S ROSS      SALESPERSON SALES      BOSTON   1300
7839 FRANCIS   A KING      PRESIDENT   ACCOUNTING NEW-YORK 5000
7876 DIANE     G ADAMS     CLERK       RESEARCH   DALLAS   1100
7902 JENNIFER  D FORD      ANALYST     RESEARCH   DALLAS   3000
7919 MICHAEL   A DOUGLAS   CLERK       RESEARCH   NEW-YORK 800


Первая задача, это выбрать все строки, в которых зарплата не меньше 1000. Вот как я сделал
grep '^.\{59\}[0-9]\{1,\}[0-9][^0-9]\{0,1\}' query1

но выводят строки в которых зарплата меньше 1000, а нужно больше, как это сделать?
И вторая задача это выбрать все строки, в которых первый инициал не 'K', а второй не 'J'. Получилось лишь когда первый инициал 'K' и второй 'L'
grep "^\S*\s*K.*\sJ\s*.*" query1
, то есть нужно поставить отрицание. Как?
И третья задача выбрать все строки, в которых имя - 'PALL', а город - 'BOSTON'. Это не получилось
  • Вопрос задан
  • 1163 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
@Karpion
У меня ощущение, что вывод получен SQL-запросом. Если так - то и фильтрацию надо делать SQL-запросом, а не извращаться с grep'ом - ибо grep вынужден парсить поля заново.

Второй вариант - работать чем-то типа AWK, который разбивает строки на поля. Правда, там м.б. проблемы при пустых полях, которые он не увидит.

1) "Зарплата от 1000 и выше" = "четыре или более цифры" = [0-9]{4,} или точнее [1-9][0-9]{3,}

2) Отрицание в regex пишется так:
[^K] - любой символ, кроме "K"
[^KJ] - любой символ, кроме "K" и "J"
[^K-P] - любой символ, кроме диапазона {от "K" до "P"}

3) Если Вам надо работать именно с полями - то, как я уже сказал, grep работает очень плохо. Вариант 'PAUL.+BOSTON' от mureevms плох тем, что сработает, если эти значения появятся в поле "фамилия", а они это могут.
Хуже того: этот вариант примет и имя "COPAULER" (придумал из пальца, чисто для примера).

Я могу напрячься и написать более корректный regex на это дело - ну, для начала огородить эти слова пробелами. Но не буду, ибо лень.
Ответ написан
@mureevms
1. 1000 - это 4 символа. Все, что меньше 1000 - 1,2 или 3 символа. Известно, что зп это последняя строка, поэтому ищутся стоящие подряд от 4-х цифр от конца строки:
grep -E '\s([0-9]{4,})$'
2. Выборка по K или J и реверс вывода
grep -E -v '(\sK\s|\sJ\s)'
3. Поиск имени и города в одной строке:
grep -E 'PAUL.+BOSTON'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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