найти общие строки в каждом столбце в пределах одного файла

Похоже, это заставляет обратный трафик также проходить через openwrt. Переписав исходный адрес, который увидит веб-сервер.

Если веб-сервер ответил напрямую клиенту, адрес источника для тех пакетов все равно будет принадлежать веб-серверу. Но клиент пытается поговорить с IP-адресом openwrt. Следовательно, ответные пакеты будут отброшены.

В первом случае такое принуждение не требуется, потому что маршрут от веб-сервера к клиентам через Интернет уже проходит через окно openwrt.

3
09.05.2017, 00:12
2 ответа

Короткийgawkподход:

awk '(index($1, $2) !=0 && length($2) >= 4) || (index($2, $1) !=0 && length($1) >= 4)' file

Вывод:

023q                                              023q023q
0adc                                              0adc0adc
123456                                              123456
abcde                                             abcdefg

index(in, find)
Поиск в строке inпервого вхождения строки findи вернуть позицию в символах, где вхождение начинается со строки in.


Для болеесложногослучая, когда нам нужно найти самую длинную общую подстроку длиной не менее 4 символов в 2 входных строках, я бы предложилPython подход:

Давайте скажем, входной файл был немного «сложным» и имел следующие строки:

1023q                                              023q023q
v0adc                                              20adc0adc
s123456                                              123456
eabcde                                             cabcdefg
08tgdf                                            90alkhg

Чтобы найти самую длинную общую подстроку, мы будем использовать классSequenceMatcherиз модуляdifflib .

find_common_lines.pyскрипт:

import re
from difflib import SequenceMatcher

with open('filename', 'r') as fh:
    for l in fh.read().splitlines():
        items = re.findall(r'\S+', l.strip())  # getting 2 comparable strings
        m = SequenceMatcher(None, items[0], items[1]).find_longest_match(0, len(items[0]), 0, len(items[1]))
        if m.size >= 4:
            print(l)

Использование(у вас может быть другая версия python3.x, текущий случай был протестирован на python3.5 ):

python3.5 find_common_lines.py

Вывод:

1023q                                              023q023q
v0adc                                              20adc0adc
s123456                                              123456
eabcde                                             cabcdefg
5
27.01.2020, 21:11

Вам нужно задействовать мощь регулярных выражений, чтобы справиться с этой проблемой, и позволить движку RE выполнять всю тяжелую работу во время просеивания. ваши данные:

sed -n '/\(\S\{4,\}\).*\s.*\1/p' yourfile

Результаты

023q                                              023q023q
0adc                                              0adc0adc
123456                                              123456
abcde                                             abcdefg
3
27.01.2020, 21:11

Теги

Похожие вопросы