Запрос специальных параметров - используется несколько для получения имени команды? [дубликат]

Вы сканируете файл один раз для каждого шаблона. Было бы намного быстрее просмотреть файл только один раз, тем более что файл не помещается в кеш.

Ваш пример кода на самом деле сохраняет только совпадения из последнего шаблона в file1 . Я предполагаю, что это чрезмерное упрощение. Если вам нужны все совпадения в одном файле, то это как если бы шаблоны были объединены вместе с помощью оператора «или».

awk '
    BEGIN {
        while (getline <"file1") pattern = pattern "|" $0;
        pattern = substr(pattern, 2);
    }
    match($0, pattern) {for(i=1; i<=3; i++) {getline; print}}
' file2 > file3

Обратите внимание, что при этом печатается не совпадающая строка, а только три следующие строки. Если вы действительно хотите напечатать совпавшую строку перед тремя последующими строками, вам понадобится дополнительная print; перед циклом for .

Если вы действительно хотите напечатать совпадающую строку перед тремя последующими строками, и ваша команда grep поддерживает аргумент -A , тогда вам следует использовать его. Специализированная программа, такая как grep, обычно быстрее интерпретируемого языка, такого как awk. В качестве дополнительного бонуса команда намного проще.

grep -A -E -f file1 file2 >file3

Если вы обнаружили, что grep работает медленнее, возможно, вы столкнулись с дефектом GNU grep в многобайтовых локали: иногда он может быть очень медленным, даже если ни файл, ни шаблон не содержат многобайтовых символов. Если вы не используете классы символов для сопоставления символов, отличных от ASCII (например, вы не используете [[: alpha:]] для сопоставления всех букв Unicode), запустите grep в локали unibyte:

LC_ALL=C grep -A3 -E -f file1 file2 >file3

Вывод команды grep не совсем такой же, как у фрагмента awk, потому что они ведут себя по-другому, если шаблон обнаруживается в одной из печатаемых строк из-за предыдущей строки.Например, если шаблон - a , а линии - a1 , a2 , b , c , d , затем grep -A3 печатает a1 , a2 , b , c тогда как фрагмент awk выше печатает a2 , b , c и фрагмент awk с дополнительным print печатает a1 , a2 , b , c .

0
27.04.2014, 04:50
0 ответов

Теги

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