awk oneliner для извлечения строки рядом с совпадающей строкой, но не для строки, имеющей совпадение - PullRequest
1 голос
/ 03 августа 2020

У меня есть файл:

$ cat test.csv
hello foo
needed
bar
blah
blah
bar
hello foo
needed
bar
blah
hello foo
needed
hello foo
needed
bar
blah

Мне нужно извлечь строки, содержащие «полосу» и строку, расположенную рядом с «привет», но не строку «привет». Пока я могу извлечь, как показано ниже, но не могу игнорировать строки приветствия. Я могу попробовать распаковать с другим awk, но интересно, есть ли один лайнер, который может позаботиться об этом в одном go?

$ awk '/hello|bar/;/hello/{getline;print}' test.csv
hello foo
needed
bar
bar
hello foo
needed
bar
hello foo
needed
hello foo
needed
bar

EDIT: ожидаемый результат -

needed
bar
bar
needed
bar
needed
needed
bar

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Вы можете использовать это awk:

awk 'p || /bar/; { p = $0 ~ /hello/ }' file
needed
bar
bar
needed
bar
needed
needed
bar

Подробности:

  • p = $0 ~ /hello/: установит p на От 1 до 0 в зависимости от того, соответствует ли строка hello или нет
  • p || /bar/ будет печатать строку, если p == 1 или если строка соответствует bar
2 голосов
/ 03 августа 2020

На основе образцов OP, не могли бы вы попробовать следующее. Написано и протестировано по ссылке https://ideone.com/EzCjLM.

awk '
/hello/{
  found_hello=1
  next
}
found_hello || /bar/{
  print
  found_hello=""
}
' Input_file

Пояснение: Добавление подробных объяснений к вышеизложенному.

awk '                     ##Starting awk program from here.
/hello/{                  ##Checking condition if line contains hello string then do following.
  found_hello=1           ##Setting variable found_hello here.
  next                    ##next will skip all further statements from here.
}
found_hello || /bar/{     ##Checking condition if found_hello is SET OR bar is found then do following.
  print                   ##Printing current line here.
  found_hello=""          ##Nullifying found_hello here.
}
' Input_file              ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...