Lista de filtros baseada no número de dígitos em strings

1

Eu tenho longa lista de entradas são gravadas em um arquivo, algo como esta pequena lista:

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
--[SNIP]--

Eu quero filtrar essa lista com base no número de dígitos (caracteres no conjunto 0123456789 ) em cada entrada e, se o número de dígitos for maior que um limite específico, mantenha a string removendo-a. no exemplo anterior, como posso manter todas as entradas com 18 dígitos em seus nomes?

Resultado esperado:

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
    
por Zahi 28.09.2018 / 18:12

4 respostas

8

com awk :

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

Usamos dígitos como o separador de campo, portanto, o número de campos será um mais o número de dígitos ( x1y é dividido em x e y ), então, acima, estamos procurando as linhas que têm pelo menos 18 dígitos.

(com mawk , substituir [:digit:] com 0-9 . mawk não suporta classes de caracteres POSIX, mas seu [0-9] contrário a outras implementações awk corresponde a 0123456789 somente independentemente da localidade. Portável, você pode usar [0123456789] , ou você pode usar [0-9] se você souber que o texto não contém dados não-ASCII).

Para linhas que têm exatamente 18 dígitos, isso seria:

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

Com sed , por pelo menos 18 dígitos:

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

com grep :

grep -E '(.*[[:digit:]]){18}'
    
por 28.09.2018 / 18:15
2

Digamos que os dados sejam salvos em um arquivo chamado file.txt e, em seguida, você pode fazer algo como:

#!/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

Ou

awk 'gsub("[0-9]", "&") >= 18'
    
por 28.09.2018 / 18:14
1

Para encontrar linhas com 18 dígitos ( [0-9] ) e mais, você pode usar grep .

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

ou

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

Descrição

egrep é o mesmo que 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
    
por 28.09.2018 / 22:20
0

Que tal usar o valor de retorno de tr do perl (semelhante ao uso do valor de retorno de gsub do awk)

$ 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
    
por 28.09.2018 / 21:51

Tags