Aqui está um pequeno programa do Python 2 que faz o que você quer. As palavras são listadas em ordem cronológica de primeira aparição, ou seja, cada nova palavra é adicionada à parte inferior da lista, mas seria fácil classificar as palavras em ordem alfabética ou por ordem de número de ocorrências.
A saída pode ser um pouco mais simples, por exemplo, se você souber o tamanho máximo da string, os números de ocorrências poderão ser alinhados em uma coluna.
wordcount.py
#! /usr/bin/env python
''' Real-time word counting
Written by PM 2Ring 2015.01.29
From http://unix.stackexchange.com/q/181722/88378
'''
CSI = '\x1b['
clear = CSI + '2J' + CSI + 'H'
def main():
words = []
wordcount = {}
while True:
try:
word = raw_input()
except (KeyboardInterrupt, EOFError):
print
break
if word not in wordcount:
words.append(word)
wordcount[word] = 1
else:
wordcount[word] += 1
print clear
for word in words:
print '%s: %d' % (word, wordcount[word])
if __name__ == '__main__':
main()
Para enviar a saída de yourprog
para este programa, você pode fazer isso:
yourprog | python wordcount.py
assumindo que wordcount.py
esteja no diretório atual.
Como alternativa, forneça wordcount.py
de permissão de execução (por exemplo, chmod a+x wordcount.py
) e coloque-a em um diretório em sua lista PATH de comando (ou seja, um diretório listado quando você faz echo "$PATH"
). Então você pode fazer
yourprog | wordcount.py
e você pode executá-lo em qualquer lugar.
Se você tiver apenas o Python 3 e não o Python 2, o programa exigirá algumas pequenas alterações para executá-lo.
FWIW, aqui está outro script Python que escrevi para testar o código acima. Imprime uma palavra aleatória, uma palavra por linha, a cada 0,5 segundos.
randwords.py
#! /usr/bin/env python
import random, time
wordlist = [
'apple',
'carrot',
'pear',
'orange',
'banana',
'cabbage',
'potato'
]
def main():
#Time delay between words, in seconds
delay = 0.5
while True:
try:
print random.choice(wordlist)
time.sleep(delay)
except KeyboardInterrupt:
print
break
if __name__ == '__main__':
main()
Você pode executá-lo, colocando sua saída em wordcount.py
da seguinte forma:
python -u randwords.py | python wordcount.py
O sinal -u
diz ao interpretador Python para usar E / S sem buffer.