Text-Processing

在單個文件的每一列中查找公共行

  • May 9, 2017

我有一個包含 2 列數據的文件。我需要從每列中找到具有公共字元串的行。我只對逐行匹配感興趣,而不是來自第 1 列第 10 行和第 2 列第 3 行的匹配字元串。

我的文件:

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

所以,在這個例子中,除了最後一行之外的每一行共享一個公共字元串,或者行的一部分或者行是相同的,這就是我需要找到的。我已經從 2 個文件中看到了大量關於常見字元串的問題和執行緒,但到目前為止,我的確切案例還沒有。

更新:每行至少需要按順序匹配 4 個字元。

方法:

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中的開始位置。


對於更複雜的情況,當我們需要在 2 個輸入字元串上找到至少 4 個字元長度的最長公共子字元串時 - 我建議使用 Python 方法:

假設輸入文件稍微“複雜”並且具有以下幾行:

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

為了找到最長的公共子字元串,我們將使用difflib模組中的SequenceMatcher類。

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

引用自:https://unix.stackexchange.com/questions/363785