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

2

Eu 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, fora 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 nelas?

    
por silc 01.11.2016 / 01:18

2 respostas

1

É mais fácil manter apenas linhas com números X ou mais . Aqui está um exemplo disso, 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 apenas manterá linhas com menos de 13 nú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 de número no comando s (após a parte /find/replace/ ) significa apenas substituir essa instância do padrão de pesquisa.

O sinalizador p no comando s significa "imprimir se uma substituição foi feita".

A opção -n , é claro, é suprimir a ação "imprimir" padrão de 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 opção -e é "executar"; apenas passa um comando. Precisamos disso aqui, já que estamos passando mais de um.

O comando t ignora os comandos restantes se o último comando s executou uma substituição.

O comando p imprime.

    
por 01.11.2016 / 01:31
3

Como você marcou sua pergunta perl , uma maneira de fazê-lo em perl seria usar o fato de que tr de perl retorna uma contagem do número de caracteres substituídos; assim, 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 expressão regular em um contexto escalar para obter uma contagem

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

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

    
por 01.11.2016 / 01:57