awk удалить между двумя шаблонами чтения из входного файла за один раз

Здравствуйте и заранее спасибо за вашу помощь.

Попытка сделать скрипт с awk, но терпит неудачу, и мне интересно, возможно ли это сделать. Например, прочитать из входного файла и удалить строки между двумя шаблонами.

Файл1 содержит:

user2

а File2 содержит строки:

ID: user1
Telpephone: 1234-5678

ID: user2
Telpephone: 1324-6598

ID: user3
Telpephone: 9087-6543

Желаемый результат выглядит следующим образом:

ID: user1
Telpephone: 1234-5678

ID: user3
Telpephone: 9087-6543

Я могу сделать это в цикле, но с большими файлами это занимает слишком много времени, можно ли сделать это за один раз с помощью awk?

С Уважением.


awk
person vhrp01    schedule 16.07.2018    source источник
comment
Не совсем понятно, что вы пытаетесь сделать. В приведенном примере предлагается удалить строки из File2, соответствующие содержимому/шаблону из File1. Но название предполагает падение между матчами? В вашем примере, что произойдет, если будет другая строка, содержащая user2? Вы бы отбросили все границы между ними? А если бы было две, три, четыре... больше таких строк? Исключить все между крайними совпадениями? Или чередуются?   -  person Ondrej K.    schedule 17.07.2018
comment
Перетащите между совпадениями, это правильно, например, соответствие между пользователем2 и первым пространством. Если найти 1, 2, 3, удаляет их все и перебрасывает линии между ними. например, с помощью команды awk '/user2/,/^$/{next}{print}' file2 можно удалить все строки между user2 и пробелом. Проблема или то, что я пытаюсь сделать, заключается в огромной множественной строке ввода, например, для ввода 10 000 пользователей и в файле размером 2 или 1 ГБ.   -  person vhrp01    schedule 17.07.2018


Ответы (1)


Данный:

$ cat skip
user2
$ cat file
ID: user1
Telpephone: 1234-5678

ID: user2
Telpephone: 1324-6598

ID: user3
Telpephone: 9087-6543

С awk в режиме абзаца:

awk  'BEGIN{RS=""; ORS="\n\n"}
      FNR==NR{for (i=1;i<=NF;i++) skip[$i]; next}
      $2 in skip {next}
      1' skip file
ID: user1
Telpephone: 1234-5678

ID: user3
Telpephone: 9087-6543

С обновлением теперь поддерживается несколько пропусков слов:

awk  'BEGIN{RS=""; ORS="\n\n"}
      FNR==NR{for (i=1;i<=NF;i++) skip[$i]; next}
      $2 in skip {next}
      1' <(echo "user2 user3") file
ID: user1
Telpephone: 1234-5678
person dawg    schedule 16.07.2018
comment
Есть ли способ пропустить более одного совпадения? $ cat skip user1 user2 $ cat file ID: user1 Telpephone: 1234-5678 ID: user2 Telpephone: 1324-6598 ID: user3 Telpephone: 9087-6543 Output: ID: user3 Telpephone: 9087-6543 - person vhrp01; 17.07.2018
comment
Да. Исправлено. Просто поместите совпадения либо через пробел, либо на отдельных строках. - person dawg; 17.07.2018
comment
С уважением, чувак, он отлично работает, как ты и упомянул. - person vhrp01; 17.07.2018