Para esta entrada fornecida:
How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this
Eu quero esta saída:
How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one
Obter linhas inteiras contém apenas três palavras "isto" repetidas. (correspondência sem distinção entre maiúsculas e minúsculas)
text-processing
αғsнιη
fonte
fonte
$RANDOM_LANGUAGE
- alguém será capaz de encontrar uma solução.Respostas:
Em
perl
, substituathis
-o sem distinção entre maiúsculas e minúsculas e conte o número de substituições:Usando uma contagem de correspondências :
Se você possui o GNU awk, é uma maneira muito simples:
O número de campos será um a mais que o número de separadores.
fonte
Supondo que seu arquivo de origem seja tmp.txt,
O grep esquerdo gera todas as linhas que não possuem 4 ou mais ocorrências que não diferenciam maiúsculas de minúsculas de "this" em tmp.txt.
O resultado é canalizado para o grep direito, que gera todas as linhas com 3 ou mais ocorrências no resultado grep esquerdo.
Atualização: Graças ao @Muru, aqui está a melhor versão desta solução,
substitua 4 por n + 1 e 3 por n.
fonte
grep
precisa terminar*
.this
.grep -iv '.*this.*this.*this.*this.*' tmp.txt | grep -i '.*this.*this.*this.* |grep -iv '.*this.*this.'
grep -Eiv '(.*this){4,}' | grep -Ei '(.*this){3}'
- isso pode torná-lo prático para N = 50.Em python, isso faria o trabalho:
saídas:
Ou para ler de um arquivo, com o arquivo como argumento:
Cole o script em um arquivo vazio, salve-o como
find_3.py
, execute-o pelo comando:É claro que a palavra "this" pode ser substituída por qualquer outra palavra (ou outra seção de string ou linha), e o número de ocorrências por linha pode ser definido como qualquer outro valor na linha:
Editar
Se o arquivo fosse grande (centenas de milhares / milhões de linhas), o código abaixo seria mais rápido; ele lê o arquivo por linha em vez de carregá-lo de uma vez:
fonte
Você pode brincar um pouco com
awk
isso:Isso retorna:
Explicação
O que fazemos é definir o separador de campos para
this
si mesmo. Dessa forma, a linha terá tantos campos +1 quanto a palavrathis
aparecer.Para torná-lo sem distinção entre maiúsculas e minúsculas, usamos
IGNORECASE = 1
. Ver referência: caso sensibilidade em Matching .Então, é apenas uma questão de dizer
NF==4
para obter todas essas linhasthis
exatamente três vezes. Não é necessário mais código, pois{print $0}
(ou seja, imprimir a linha atual) é o comportamento padrão deawk
quando uma expressão é avaliadaTrue
.fonte
Assumindo que as linhas são armazenadas em um arquivo chamado
FILE
:fonte
sed ...
comando e adicionar a-o
opçãogrep -oi ...
.$(grep -ic "this" <<<"$line")
-c
opção contará o número de linhas que correspondem a "this" e não o número de "this" words em cada linha.-l
e-w
seria equivalente neste caso?Se você estiver no Vim:
Isso imprimirá apenas linhas correspondentes.
fonte
Solução one-liner Ruby:
Funciona de uma maneira bastante simples: redirecionamos o arquivo para o stdin do ruby, o ruby obtém a linha do stdin, limpa-o com
chomp
edowncase
, escan().count
nos fornece o número de ocorrências de uma substring.fonte