Ваша реализация оболочки может быть сделана еще короче, grep
имеет опцию -c
, чтобы получить счетчик, нет необходимости в анонимном канале и wc
:
grep -c " 1 " examplefile
Ваш шелл-код просто подсчитывает количество строк, в которых находится шаблон 1
, но ваш код Python дополнительно хранит список индексов строк, в которых сопоставляется шаблон.
Только для подсчета количества строк вы можете использовать sum
и GeneXP / список понимания, также нет необходимости в Regex; простая строка __contains__
проверка будет выполнена, поскольку строки являются итеративными:
with open('examplefile') as f:
count = sum(1 for line in f if ' 1 ' in line)
print(count)
Если вы также хотите сохранить индексы, вы можете придерживаться своей идеи, заменив только re
test на str
test:
count = 0
indexes = []
with open('examplefile') as f:
for idx, line in enumerate(f):
if ' 1 ' in line:
count += 1
indexes.append(idx)
Кроме того, делать голые except
почти всегда плохая идея (по крайней мере, вы должны использовать except Exception
, чтобы исключить SystemExit
, KeyboardInterrupt
как исключения), ловите только те исключения, которые, как вы знаете, могут возникнуть.
Кроме того, при разборе структурированных данных вы должны использовать специальный инструмент, например, здесь csv.reader
с пробелом в качестве разделителя (line.split(' ')
также должно быть сделано в этом случае) и проверка по индексу-4 была бы наиболее безопасной (см. ответ Томалака ). С тестом ' 1 ' in line
результаты будут вводить в заблуждение, если любой другой столбец содержит 1
.
Учитывая вышеизложенное, вот способ оболочки, использующий awk
для сопоставления с 5-м полем:
awk '$5 == "1" {count+=1}; END{print count}' examplefile