encontre linhas comuns em cada coluna dentro de um único arquivo

3

Eu tenho um arquivo com 2 colunas de dados. Eu preciso encontrar as linhas que têm uma string comum de cada coluna. Estou interessado apenas nos jogos linha por linha, não em uma sequência correspondente da coluna 1, linha 10, e linha 2, coluna 3.

meu arquivo:

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

Assim, neste exemplo, cada linha, exceto a última linha, compartilha uma string comum, ou uma parte da linha ou as linhas são idênticas, e é isso que preciso encontrar. Eu vi toneladas de perguntas e tópicos em seqüências de caracteres comuns de 2 arquivos, mas nada até agora no meu caso de uso exato.

UPDATE: pelo menos 4 caracteres precisam corresponder, em ordem, em cada linha.

    
por user53029 08.05.2017 / 22:52

2 respostas

5

Abordagem curta gawk :

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

A saída:

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

index(in, find)
Search the string in for the first occurrence of the string find, and return the position in characters where that occurrence begins in the string in.

Para o caso mais complexo , quando precisamos encontrar a substring mais comum com pelo menos 4 caracteres em 2 strings de entrada - eu sugeriria > Python abordagem:

Digamos que o arquivo de entrada tenha sido um pouco "sofisticado" e tenha as seguintes linhas:

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

Para encontrar a subseqüência de caracteres comum mais longa, usaremos SequenceMatcher classe do módulo difflib .

find_common_lines.py script:

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)

Uso (você pode ter outra versão do python 3.x, o caso atual foi testado em python 3.5):

python3.5 find_common_lines.py

A saída:

1023q                                              023q023q
v0adc                                              20adc0adc
s123456                                              123456
eabcde                                             cabcdefg
    
por 08.05.2017 / 23:16
3

Você precisa trazer o poder de regexes para lidar com esse problema e deixar que o mecanismo RE faça todo o trabalho pesado enquanto analisa seus dados:

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

Resultados

023q                                              023q023q
0adc                                              0adc0adc
123456                                              123456
abcde                                             abcdefg
    
por 09.05.2017 / 13:58