2つのファイルの最大の共通部分を表示する方法は?

2つのファイルの最大の共通部分を表示する方法は?

comm両方のファイルのすべての共通行を使用または表示する方法を知っています。しかし、最大の共通部分、つまり最も一般的な行のみを連続して表示するにはどうすればよいですか?diffgrep

(同じように大きな共通部分がある場合、どの部分が表示されるかは重要ではないと思います。最初でも最後でも定義されていない動作でも。私が知る限り、最大の共通部分は常に次より大きいです。

例:

A
B
C
D
E
F
G
A
X
D
E
F
B
C

共通部分はABCと ですDEF。私が探している最大の共通分母は、DEF1行と2行に過ぎないものに比べて3行ですABC

ベストアンサー1

この方法は、2つのファイルの全体的な違いを単一のコンテキストに配置することに基づいています。したがって、両方のファイルが999,999行より長くないと仮定します。

./foo.sh755に対して次のスクリプトを作成しますchmod

#!/usr/bin/env bash

max=0   # length of the highest consecutive section found
fline=  # first line of the highest consecutive section found
tline=  # first line of the current consecutive section found
n=0     # scratch counter

while IFS= read -r line
do
    case ${line:0:1} in
    ' ')    n=$(($n+1))
            [ $n -eq    1 ] && tline="${line:1}"
            [ $n -gt $max ] && { max=$n; fline="$tline"; }
            ;;
    *)      n=0
    esac
done

printf "the largest section is %d lines starting with '%s'\n" $max "$fline"

次にdiff、ファイルを実行してシェルにパイプします。シェルは、スペースで始まる最長行を見つけ、そのセクションの最初の行の値を報告します。

$ diff -u999999 file1 file2 | ./foo.sh 
the largest section is 3 lines starting with 'D'

おすすめ記事