Как исключить совпадающую строку и строку, которая предшествует ей? - PullRequest
0 голосов
/ 21 декабря 2018

В моем проекте я хочу исключить некоторое содержимое в a.txt.

Содержимое в a.txt:

3085180 nscc135 PEND  intelg_sma gcn01                   *_D4d_5.sh Dec 14 14:32
The user has reached his/her job slot limit;
3085182 nscc135 PEND  intelg_sma gcn01                   *_C3v_5.sh Dec 14 14:32
The user has reached his/her job slot limit;
3085184 nscc135 PEND  intelg_sma gcn01                   *_C3v_5.sh Dec 14 14:33
The user has reached his/her job slot limit;
3085186 nscc135 PEND  intelg_sma gcn01                   *_D4d_5.sh Dec 14 14:33
The user has reached his/her job slot limit;
3095798 nsgg289 PEND  intelg_sma gcn03                   400./      Dec 19 09:51
One of the user's groups has reached its job slot limit;
3096822 nsgg289 PEND  intelg_sma gcn03                   460./      Dec 19 18:00
One of the user's groups has reached its job slot limit;
3098784 nsgg289 PEND  intelg_sma gcn04                   xhzha      Dec 20 14:48
One of the user's groups has reached its job slot limit;
3099298 nsgg276 PEND  intelg_sma gcn01                   Pd3.2      Dec 20 18:11
The user has reached his/her job slot limit;
3099299 nsgg276 PEND  intelg_sma gcn01                   Pd2.8      Dec 20 18:12
The user has reached his/her job slot limit;
3099311 nsgg276 PEND  intelg_sma gcn01                   Pt1.8      Dec 20 18:40
The user has reached his/her job slot limit;
3099312 nsgg276 PEND  intelg_sma gcn01                   Pt2        Dec 20 18:41
The user has reached his/her job slot limit;

Я хочу исключить эту строку, содержащую содержимоеThe user и предыдущей строки.Я пытался:

grep -A 1 -v "The\ user" a.txt

и

grep -AB 1 -v "The\ user" a.txt

Но они оба не удалось.

Правильный результат должен быть:

3095798 nsgg289 PEND  intelg_sma gcn03                   400./      Dec 19 09:51
One of the user's groups has reached its job slot limit;
3096822 nsgg289 PEND  intelg_sma gcn03                   460./      Dec 19 18:00
One of the user's groups has reached its job slot limit;
3098784 nsgg289 PEND  intelg_sma gcn04                   xhzha      Dec 20 14:48
One of the user's groups has reached its job slot limit;

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Это также работает только с использованием sed:

sed -e 'N;s/\n/####/;/The user/d' -e 's/####/\n/g' a.txt

Результат:

3095798 nsgg289 PEND  intelg_sma gcn03                   400./      Dec 19 09:51
One of the user's groups has reached its job slot limit;
3096822 nsgg289 PEND  intelg_sma gcn03                   460./      Dec 19 18:00
One of the user's groups has reached its job slot limit;
3098784 nsgg289 PEND  intelg_sma gcn04                   xhzha      Dec 20 14:48
One of the user's groups has reached its job slot limit;

Сначала используйте N;s/\n/####/;/The user/d, чтобы объединить две строки с #### и удалить строкус The user;Затем вызовите s/####/\n/g, чтобы разбить совпавшую строку на две строки.

0 голосов
/ 21 декабря 2018

Я не думаю, что -A и -B работают так, как вы ожидаете с -v.Он не будет «также исключать» предыдущую или следующую строку.Поэтому я не верю, что существует решение вашей проблемы с использованием только grep.

. Один из подходов состоит в том, чтобы получить номера строк строк, содержащих ваш шаблон, и строк, непосредственно предшествующих им.Затем используйте sed, чтобы удалить эти номера строк:

grep -n -B 1 'The user' a.txt | egrep -v '^-' | sed -r 's/^([0-9]+).*/\1d/' | sed -f - a.txt

Результат:

$ grep -n -B 1 'The user' a.txt | egrep -v '^-' | sed -r 's/^([0-9]+).*/\1d/' | sed -f - a.txt
3095798 nsgg289 PEND  intelg_sma gcn03                   400./      Dec 19 09:51
One of the user's groups has reached its job slot limit;
3096822 nsgg289 PEND  intelg_sma gcn03                   460./      Dec 19 18:00
One of the user's groups has reached its job slot limit;
3098784 nsgg289 PEND  intelg_sma gcn04                   xhzha      Dec 20 14:48
One of the user's groups has reached its job slot limit;

Объяснено:

grep -n -B 1 'The user' a.txt  # Print each line matching 'The user' and one line preceding it, the -n flag prefixes output with line number
egrep -v '^-'                  # The use of grep -B causes grep to separate match groups with '--', we want to disregard those lines
sed -r 's/^([0-9]+).*/\1d/'    # Extract the line numbers and with them create sed delete commands 
sed -f - a.txt                 # and finally feed those commands to sed, operating on your input file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...