У меня есть скрипт python, данный шаблон просматривает файл, и для каждой строки, которая соответствует шаблону, он подсчитывает, сколько раз эта строка отображается в файле.Подсчитайте строки, соответствующие различным шаблонам за один проход
Сценарий следующий:
#!/usr/bin/env python
import time
fnamein = 'Log.txt'
def filter_and_count_matches(fnamein, fnameout, match):
fin = open(fnamein, 'r')
curr_matches = {}
order_in_file = [] # need this because dict has no particular order
for line in (l for l in fin if l.find(match) >= 0):
line = line.strip()
if line in curr_matches:
curr_matches[line] += 1
else:
curr_matches[line] = 1
order_in_file.append(line)
#
fout = open(fnameout, 'w')
#for line in order_in_file:
for line, _dummy in sorted(curr_matches.iteritems(),
key=lambda (k, v): (v, k), reverse=True):
fout.write(line + '\n')
fout.write(' = {}\n'.format(curr_matches[line]))
fout.close()
def main():
for idx, match in enumerate(open('staffs.txt', 'r').readlines()):
curr_time = time.time()
match = match.strip()
fnameout = 'm{}.txt'.format(idx+1)
filter_and_count_matches(fnamein, fnameout, match)
print 'Processed {}. Time = {}'.format(match, time.time() - curr_time)
main()
Так прямо сейчас я иду на файл каждый раз, когда я хочу, чтобы проверить на другой шаблон. Можно сделать это, перейдя по файлу только один раз (файл довольно большой, так что требуется некоторое время для обработки). Было бы неплохо иметь возможность сделать это элегантным «легким» способом. Благодаря!
Благодаря
Не ответ на ваш вопрос, но 'grep', вероятно, будет более полезным здесь, если это на самом деле конечная цель для вашей проблемы. –