Вот небольшая программа на Python 2, которая делает то, что вы хотите. Слова перечислены в хронологическом порядке первого появления, то есть каждое новое слово добавляется в конец списка, но было бы легко отсортировать слова по алфавиту или по количеству вхождений.
Вывод может быть немного более аккуратным, например, если вы знаете максимальную длину строки, тогда номера вхождений можно выровнять в столбце.
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()
Чтобы передать вывод yourprog
в эту программу, вы можете сделать следующее:
yourprog | python wordcount.py
предполагая, что wordcount.py
находится в текущем каталоге.
В качестве альтернативы предоставьте wordcount.py
разрешение на выполнение (например, chmod a + x wordcount.py
) и поместите его в каталог в вашем списке PATH команд (т. Е. В каталог, указанный при вы выполняете echo "$ PATH"
). Затем вы можете выполнить
yourprog | wordcount.py
и запускать его где угодно.
Если у вас есть только Python 3, а не Python 2, программа потребует некоторых незначительных изменений для ее запуска.
FWIW, вот еще один сценарий Python, который я написал для проверки приведенного выше кода.Он печатает случайное слово, по одному слову в строке, каждые 0,5 секунды.
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()
Вы можете запустить его, передав его вывод в wordcount.py
следующим образом:
python -u randwords.py | python wordcount.py
Флаг -u
указывает интерпретатору Python использовать небуферизованный Ввод / вывод.
Это задокументировано на вики Ubuntu . По умолчанию он установлен для уменьшения количества зависимостей в пакетах, но, как вы обнаружили, это означает, что порядок библиотек имеет значение :, вам необходимо убедиться, что объекты (любого типа )появляются до ] библиотеки, которые они используют.
Вы можете отключить это с помощью --no-as-needed
.