Список фильтров на основе количества цифр в строках

Вот как я получаю информацию, чтобы обеспечить явные зависимости для файла спецификации:

  • Requires: см. мой сценарий здесь;
  • BuildRequires: используйте auti-buildrequires инструмент от Richard Jones;

1
29.09.2018, 01:23
4 ответа

Сawk:

awk -F '[[:digit:]]' 'NF > 18'

Мы используем цифры в качестве разделителя полей, поэтому количество полей будет равно единице плюс количество цифр(x1yделится на xи y), поэтому выше мы ищем строки, которые имеют не менее 18 цифр.

(на mawk, замените [:digit:]на 0-9. mawkне поддерживает классы символов POSIX, но его [0-9], в отличие от других awkреализаций, соответствует только 0123456789 независимо от локали. Переносимо, вы можете использовать [0123456789]или вы можете использовать [0-9], если вы знаете, что текст не содержит не -данных ASCII ).

Для строк, которые имеют ровно 18 цифр, это будет:

awk -F '[[:digit:]]' 'NF == 19'

С помощью sedне менее 18 цифр:

sed -e 's/[[:digit:]]/&/18;t' -e d

Сgrep:

grep -E '(.*[[:digit:]]){18}'
8
27.01.2020, 23:11

Как насчет использования возвращаемого значения Perltr(аналогично использованию возвращаемого значения awkgsub)

$ perl -ne 'print if tr{0-9}{0-9} >= 18' file
FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
0
27.01.2020, 23:11

Чтобы найти строки с 18 цифрами([0-9])и более, вы можете использовать grep.

egrep '([0-9][^0-9]*){18}'

или

grep -E '([0-9][^0-9]*){18}'

Описание

egrepсовпадает с grep -E.

grep      # Command to filter text using regular expressions
-E        # Use extended regex

(
  [0-9]   # Exactly one digit
  [^0-9]* # 0 or more characters except digits
)           
{18}      # Find 18 times
1
27.01.2020, 23:11

Предположим, что данные сохранены в файле с именем file.txt, тогда вы можете сделать что-то вроде:

#!/bin/bash
cat file.txt | while IFS= read line; do

n=$(echo $line | awk '{print gsub("[0-9]", "")}')
if [[ $n -gt 17 ]]; then 

echo $line
fi
done

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049

или

awk 'gsub("[0-9]", "&") >= 18'
2
27.01.2020, 23:11

Теги

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