如何显示两个文件的最大公共部分?

如何显示两个文件的最大公共部分?

我知道如何使用comm或显示两个文件的每个公共行。但是我怎样才能只显示最大的公共部分,即连续的最常见的行呢?diffgrep

(如果有同样大的公共部分,我对将显示哪个部分感到无关紧要。无论是第一个、最后一个还是未定义的行为。就我而言,最大的公共部分总是比任何其他公共部分大得多。 )

例子:

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

公共部分是ABCDEF。我正在寻找的最大共同点是DEF3 行与只有 1 行和 2 行的A比较。BC

答案1

此方法基于将两个文件的整个差异放入单个上下文中。因此,它假设两个文件的长度都不会超过 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您的文件并将其通过管道传输到 shell 中。 shell 只是查找以空格开头的最长的行,并报告该部分第一行的值:

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

相关内容