结果

结果

我有一个包含 2 列数据的文件。我需要从每列中找到具有公共字符串的行。我只对逐行匹配感兴趣,而不是对第 1 列第 10 行和第 2 列第 3 行的匹配字符串感兴趣。

我的文件:

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

因此,在这个示例中,除了最后一行之外的每一行都共享一个公共字符串,该行的一部分或这些行是相同的,这就是我需要找到的。我已经在两个文件中看到了大量关于常见字符串的问题和线索,但到目前为止还没有看到关于我的确切用例的信息。

更新:每行至少需要按顺序匹配 4 个字符。

答案1

短的呆呆地方法:

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

输出:

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

索引(在,查找)
搜索字符串字符串第一次出现的位置寻找,并返回该字符串在字符串中开始出现的字符位置


为了更多复杂的当我们需要在 2 个输入字符串上找到长度至少为 4 个字符的最长公共子字符串时,我建议Python 方法:

假设输入文件稍微“复杂”并且包含以下几行:

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

为了找到最长的公共子串,我们将使用序列匹配器班级来自差异库模块。

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

答案2

您需要发挥手头的力量regexes来解决这个问题,并让RE引擎在筛选数据时完成所有繁重的工作:

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

结果

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

相关内容