Извлечь строки (и некоторые строки до и после), которые имеют определенный текст или условие - PullRequest
0 голосов
/ 28 марта 2019

Я анализирую некоторые данные журнала из процесса и имею различные столбцы, такие как идентификатор, дата, время, код журнала, текст журнала. идентификатор уникален для продукта дата и время - компоненты времени, когда был захвачен журнал. Код журнала - это код, специфичный для текста журнала. текст журнала - это 256-символьный текст, описывающий процесс

, например

ID  Date             time   log id          log text
A   01/10/18    9:00:00 bbb process begin
A   01/10/18    9:00:00 yyy dimensions not specified
A   01/10/18    9:00:30 fff failure
A   01/10/18    9:00:30 ddd dispatched
A   01/10/18    9:00:30 sss process success
B   01/10/18    9:01:01 bbb process begin
B   01/10/18    9:01:50 mmm moved to stage2
B   01/10/18    9:02:50 aaa space not allocated
B   01/10/18    9:02:50 fff failure

Я хочу выполнить grep (или, скорее, создать подмножество) указанного набора данных в выходных данных csv или xls, которые удовлетворяют следующим условиям (могут быть изменены), например:

  1. 2 строки над строкой, где текст журнала = не удалось
  2. все строки с идентификатором журнала sss

так что мой ожидаемый результат -

ID  Date            time    log id  log text
A   01/10/18    9:00:00 bbb process begin
A   01/10/18    9:00:00 yyy dimensions not specified
A   01/10/18    9:00:30 fff failure
B   01/10/18    9:01:50 mmm moved to stage2
B   01/10/18    9:02:50 aaa space not allocated
B   01/10/18    9:02:50 fff failure
A   01/10/18    9:00:30 sss process success

используя обсуждение в теме ниже: Grep для слова, и, если найдено, выведите 10 строк до и 10 строк после совпадения шаблона

Я попробовал какой-то кусок кода, чтобы получить следующий фрагмент: подпроцесс импорта

filename = "filename.csv"    
string_to_search = "failure"    
extract = (subprocess.getstatusoutput("grep -C 2 '%s' %s"%(string_to_search, filename)))[1]
print(extract)

1 Ответ

2 голосов
/ 28 марта 2019

Вы можете использовать этот код:

with open("text.txt", "r") as f:
    output = open("output.txt", "w")
    count = 0
    lines = f.readlines()
    for line in lines:
        if "sss" in line:
            output.write(line)
        elif "failure" in line:
            output.write(lines[lines.index(line) - 2])
            output.write(lines[lines.index(line) - 1])
            output.write(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...