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

У меня есть файл с 2 столбцами данных. Мне нужно найти строки, которые имеют общую строку из каждого столбца. Меня интересуют только совпадения по строкам, а не строка соответствия из столбца 1 строки 10 и столбца 2 строки 3.

мой файл:

023q 023q023q 0adc 0adc0adc 123456 123456 abcde abcdefg 08tgdf 90alkhg 

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

ОБНОВЛЕНИЕ: по крайней мере 4 символа должны соответствовать, по порядку, каждой строке.

Короткое решение 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)
Найдите строку в первом вхождении строки find и верните позицию в символы, где это вхождение начинается в строке.


Для более сложного случая, когда нам нужно найти самую длинную общую подстроку длиной не менее 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) 

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

 python3.5 find_common_lines.py 

Выход:

 1023q 023q023q v0adc 20adc0adc s123456 123456 eabcde cabcdefg 

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

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

Результаты

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