Mantenha apenas linhas contendo x ou menos números. Arquivo TXT

Mantenha apenas linhas contendo x ou menos números. Arquivo TXT

Encontrei uma pergunta semelhante:

Mas neste caso quero verificar não o comprimento total, mas o número de dígitos na linha. Por exemplo, desta entrada:

cdc85e24-b9e9-8802-080a-b84479e1ae82  
ekodeveloper0  
1795475824.1129747.1472396049615.ref  
1795475824.1129747.1472396049615  
967175540.1194446.1472407271491  
wangxiuyan552  
jveazey  
xoloki  
whelee  
matthauck  
patel3.anirudh  
mischa.salle  

Como posso excluir todas as linhas com mais de N dígitos?

Responder1

Como você marcou sua pergunta perl, uma maneira de fazer isso em Perl seria usar o fato de que Perl trretorna uma contagem do número de caracteres substituídos; então, por exemplo (tomando N = 13), você poderia fazer

perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle

Uma maneira possivelmente mais convencional seria avaliar a correspondência de regex em um contexto escalar para obter uma contagem

perl -ne '$c = () = /\d/g; print unless $c > 13' file

Veja por exemploExiste um atalho Perl para contar o número de correspondências em uma string?

Responder2

É mais fácil manter apenas linhas com X oumaisnúmeros. Aqui está um exemplo onde X é 13:

sed -n 's/[0-9]/&/13p' input.txt > output.txt

No entanto, você pode modificar isso para fazer o inverso. Aqui está um comando que manterá apenas as linhas commenos de 13números:

sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt

Explicação - imprima apenas linhas com mais de 13 números

sed -n 's/[0-9]/&/13p' input.txt > output.txt

O &símbolo no texto de substituição significa “tudo o que foi correspondido”.

O sinalizador numérico no scomando (após a /find/replace/parte) significa apenas substituir aquela instância do padrão de pesquisa.

A pbandeira no scomando significa “imprimir se uma substituição foi feita”.

A -nopção, é claro, é suprimir a ação "imprimir" padrão do Sed.

Explicação - imprima apenas linhas com <13 números

sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt

A -eopção é "executar"; apenas passa um comando. Precisamos disso aqui já que estamos passando por mais de um.

O tcomando ignora os comandos restantes se o último scomando executou uma substituição.

O pcomando é impresso.

informação relacionada