Как найти N строк, содержащих конкретную строку со смещением и наоборот? - PullRequest
0 голосов
/ 30 октября 2019

Как найти N строк, содержащих определенную строку, заданную смещением в обратном порядке? С python в Unix.

Задан файл:

a
babc1
c
abc1
abc2
d
e
f

Задано смещение: 20 (это "d"), строка: "abc", N: 2, вывод долженbe:

strings:
# the babc1 will not count since we only need 2
abc1
abc2

offset: (we need to return the offset where the search ends)
10 ((the "a" in "abc1")

Приведенный выше пример - просто демонстрация, реальный файл - журнал 33 ГБ, поэтому мне нужно принимать смещение в качестве ввода и вывода.

Я думаю, что ядропроблема заключается в следующем: как обратно прочитать строки из файла с заданным смещением? Смещение около хвоста.

Я пытался сделать это с помощью bash, это была агония. Есть ли элегантный, эффективный способ сделать это в python2? Кроме того, мы будем запускать скрипт с подходящим (капсула ansible), поэтому зависимость должна быть максимально простой.

Ответы [ 3 ]

0 голосов
/ 30 октября 2019

Вы можете использовать seek, чтобы перейти к смещению в файле следующим образом:

def reverse_find(string, offset, count):

    with open("FILENAME") as f:
        f.seek(offset)
        results = []

        while offset > 1 and count > 0:
            line = ""
            char = ""

            while char is not "\n":
                offset -= 1
                f.seek(offset)
                char = f.read(1)
                line = char + line

            if string in line:
                results = [line.strip()] + results
                count -= 1

        return results, offset + 1

print(reverse_find("abc", 20, 2))

Это вернет:

(['abc1', 'abc2'], 10)
0 голосов
/ 30 октября 2019

Спасибо за рассар. Но я нахожу здесь ответ https://stackoverflow.com/a/23646049/9782619. Более эффективный, чем у Маккереля, требующий меньше зависимостей, чем у Рассара.

0 голосов
/ 30 октября 2019

Вы можете использовать следующую функцию:

from file_read_backwards import FileReadBackwards

def search(filename, file_size, offset, substring, n):
    off = 0
    with FileReadBackwards(filename) as f:
        while off < (file_size - offset):
            line = f.readline()
            off += len(line)
        found = 0
        for line in f:
            off += len(line)
            if substring in line:
                yield line
                found += 1
            if found >= n:
                yield file_size - off - 1
                return

Используйте это следующим образом:

s = "s.txt"
file_size = 25
offset = 20
string = "abc"
n = 2

*found, offset = search(s, file_size, offset, string, n)
print(found, offset)

Печать:

['abc2', 'abc1'] 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...