Python
Aqui está uma maneira de fazer isso em Python através da compreensão da lista (veja abaixo para uma versão alternativa mais curta).
$ python -c 'import sys;print([ l for i,l in enumerate(sys.stdin,1) if i==2][0].count("word"))' < input.txt
3
$ cat input.txt
nothing here
word and another word, and one more word
last line
Como isso funciona:
- nós executamos o interpretador python com
-c
flag, os comandos estão contidos entre aspas simples;
- o arquivo de entrada
input.txt
é redirecionado para stdin
stream do interpretador python via <
shell operator. Por isso, precisamos de sys
module.
- Usando a estrutura de compreensão de listas
[something for item in something]
, lemos linhas de texto de sys.stdin
.
-
enumerate(sys.stdin,1)
nos permite enumerar as linhas, ou seja, a cada iteração da compreensão da lista, obteremos a linha de texto na variável l
e indexaremos na variável i
iniciando a contagem em 1.
- O
i==2
filtrará apenas a linha cujo índice é igual a 2. É assim que sabemos qual linha extrair.
- Assim, como resultado, nossa lista conterá apenas um item e, dentro da lista, seu índice será
0
. Então, nos referimos a esse item como [<list comprehension stuff here>][0]
.
-O .count("word")
é o que realmente faz o trabalho de contar. Por definição, ele retorna um número de ocorrências não sobrepostas de uma substring em uma string.
- finalmente, tudo isso estava contido na declaração
print()
. Então, qualquer número que o método .count()
retorne aparecerá na tela.
Versão mais curta
A maneira mais curta de fazer o mesmo em Python seria usar o método readlines()
em vez da compreensão da lista e referir-se ao item específico na lista que readlines()
produz. Note que readlines()
produz uma lista, e listas em Python são indexadas em 0, o que significa que se você quiser ler a linha x, você deve referenciar o item de lista x-1. Por exemplo,
$ python -c 'import sys;print(sys.stdin.readlines()[1].count("word"))' < input.txt
3
sed + grep
É claro que não precisamos nos limitar apenas às linguagens de script. sed
e grep
fornecem ferramentas suficientes que podemos usar para atender às nossas necessidades. Com grep -c
podemos contar a ocorrência de linhas correspondentes, então tudo o que precisamos fazer é extrair a linha específica que precisamos e dividir todas as palavras dessa linha em linhas separadas. Assim:
$ sed -n '2{s/ /\n/g;p}' input.txt | grep -c 'word'
3