Проверить наличие всех паттернов в файле

Другой инструмент, который может сделать это, — tsv-prettyиз eBay's TSV Utilities(отказ от ответственности :Я автор ). Это требует дополнительного шага выравнивания числовых полей по десятичной точке. Например:

$ tsv-pretty foo
case           elems   meshing  nlsys
uniform         2350  0.076662   2.78
non-conformal    348  0.013332   0.55
scale            318  0.013333   0.44
smarter          504  0.016666   0.64
submodel         360  .009999   0.40
unstruct-quad    640  0.019999   0.80
unstruct-tri    1484  0.01       0.88

Существует несколько вариантов форматирования. Например, -uподчеркивает заголовок, а -fаналогично форматирует числа с плавающей запятой в поле для удобочитаемости:

$ tsv-pretty foo -f -u
case           elems   meshing  nlsys
----           -----   -------  -----
uniform         2350  0.076662   2.78
non-conformal    348  0.013332   0.55
scale            318  0.013333   0.44
smarter          504  0.016666   0.64
submodel         360  0.009999   0.40
unstruct-quad    640  0.019999   0.80
unstruct-tri    1484  0.010000   0.88

Дополнительную информацию можно найти в tsv -красивой ссылке .

2
14.04.2020, 18:54
3 ответа

Это может сработать:

sort -u patterns.txt > sorted_patterns.txt # only once
diff -sq <(grep -o -f sorted_patterns.txt file.txt | sort -u) sorted_patterns.txt

Если у вас фиксированные строки вместо шаблонов, используйте -F. Это делает grepнамного быстрее!

Вы также можете использоватьcmpвместо diff -s. Это может быть немного быстрее, но не сможет показать, чего не хватает.


Вывод, если найдены не все шаблоны:

Files /dev/fd/63 and /dev/fd/62 differ

или если все закономерности найдены:

Files /dev/fd/63 and /dev/fd/62 are identical

Опустите -q, чтобы узнать , чего не хватает.

2a3
> missing_word
0
19.03.2021, 02:29
cat file.txt | awk '
    NR == FNR {seen[$0] = 0; next} 
    {for (p in seen) if ($0 ~ p) seen[p]++} 
    END {
        for (p in seen) 
            if (seen[p] == 0) {
                missing++
                print "missing pattern", p
            } 
        if (missing == 0) print "all found"
        exit missing
    }
' patterns.txt -

Замените команду catлюбым конвейером, создающим текст.

1
19.03.2021, 02:29

с grepи расширением PCRE, а также с использованием мощности команды printf; вы бы сделали что-то вроде:

<infile grep -qzP "(?s)$(printf "(?=.*?%s)" $(<pattern.txt))" &&
 echo 'all matched' ||
 echo 'one or more pattern(s) does not found'

если все шаблоны (в в любом порядке)найдены во входном файле в файле то текстall matchedбудет отправлен на вывод; в противном случае текстone or more pattern(s) does not foundбудет отображаться эхом.

это будет действовать шаблон как совпадающий шаблон, например pat[01]будет соответствовать обоим pat0и pat1; чтобы соответствовать точному шаблону, скажем, pat[01]буквально измените модификатор управления printfс %sна %q, который будет экранировать специальные символы.

<infile grep -qzP "(?s)$(printf "(?=.*?%q)" $(<pattern.txt))" &&
 echo 'all matched' ||
 echo 'one or more pattern(s) does not found'
0
19.03.2021, 02:29

Теги

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