結果

結果

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

インデックス(in,find)
検索文字列存在する文字列が初めて表示される場合探す、文字列に文字列が表示され始める文字位置を返します。存在する


以上複雑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)

使用法(他のものがあるかもしれません。Pythonバージョン 3.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

関連情報