Сопоставление нескольких шаблонов из «файла шаблона» в режиме абзаца -

Просто удалите ведение журнала:

# tune2fs -O ^has_journal /dev/sdbX
# fsck.ext2 /dev/sdbX

Затем вы можете просто удалить файл .journal.

-1
05.01.2021, 14:53
3 ответа

Поскольку вы уже знаете о режиме «абзац», следующий подход должен сработать. Сначала он проанализирует файл «patterns», а затем фактический ввод. Вывод выводится на консоль, как обычно, но, конечно, может быть перенаправлен в файл :

.
awk -v ORS="\n\n" 'NR==FNR{pat[++npat]=$0;next}
                   {for (i=1;i<=npat;i++) {if (index($0,pat[i])) {print;next}}}' patterns.txt RS="" input.txt
  • Прежде всего, это установит разделитель выходной записи в два символа новой строки, гарантируя, что напечатанные абзацы будут разделены пустой строкой, как во входных данных.

  • При обработке первого файла (, где FNR, счетчик на -строк файла -равен NR, глобальному счетчику строк ), мы просто сохраняем все шаблоны в массиве переменная pat.

  • Для второго файла разделитель записей устанавливается пустым, что указывает awkна запуск в «режиме абзаца». Затем мы перебираем все шаблоны и явно смотрим, найдены ли они во входной записи с помощью функции index().

Примечание

  • Это решение будет выполнять «частичное сопоставление строк», то есть абзац будет считаться совпадением, если любой из «шаблонов» встречается где-либо в одной из строк.

  • Функция index()используется потому, что она гарантирует буквальное сопоставление строк даже в тех случаях, когда ваши «шаблоны поиска» содержат специальные символы для регулярных выражений. Если вы действительно хотите использовать сопоставление регулярных выражений, используйте вместо этого if ($0 ~ pat[i]).

1
18.03.2021, 22:38

Чтобы сопоставить шаблоны в match, введите каждый как отдельный шаблон с вводом infile, попробуйте:

awk -F'\n' '!input && !matches[$0]{ next; };
    { for(i=1; i<=NF; i++) {
          if($i in matches) { print sep $0; sep=ORS; break; };
      };
    }' match input=1 RS= infile

или для сопоставления шаблонов из вводаmatchв качестве блока шаблонов с вводомinfile(добавьте один блок, аналогичный вводу match, к infile, чтобы проверить ), попробуйте:

awk -v RS= '!input && !matches[$0]{ next; }; ($0 in matches)' match input=1 infile
2
18.03.2021, 22:38

Предполагая, что вы хотите выполнить полное -сопоставление строк, это то, что вам нужно:

$ cat tst.awk
BEGIN {
    ORS = "\n\n"
    FS = "\n"
}
NR==FNR {
    tgts[$0]
    next
}
{
    out = "unmatched"
    for (i=1; i<=NF; i++) {
        if ($i in tgts) {
            out = "matched"
            break
        }
    }
    print > out
}

$ awk -f tst.awk targets RS= file

$ ls *matched
matched  unmatched

$ head -100 *matched
==> matched <==
DFJKHDKQW
YYYYYYYYYYYY
SDFLKJHSDKLFH

DSFLKHSDLKFH
DFIHERFW
ADFKJH
OIGHRFGH
XXXXXXXXXXXX
SDKFLJH

OIHGSDFG
AAAAAAAA
LFKHFGJKDGH
KLJHLUG

DFSDKLF
YYYYYYYYYYYY


==> unmatched <==
DFLKHSDFKLH
SDSDJKLFHSDK

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

3
18.03.2021, 22:38

Теги

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