두 파일의 가장 큰 공통 부분을 표시하는 방법은 무엇입니까?

두 파일의 가장 큰 공통 부분을 표시하는 방법은 무엇입니까?

comm두 파일의 모든 공통 행을 사용하거나 표시하는 방법을 알고 있습니다 . 그런데 가장 큰 공통 부분, 즉 가장 일반적인 행만 연속으로 표시하려면 어떻게 해야 합니까?diffgrep

(동일하게 큰 공통 부분이 있는 경우 어떤 부분이 표시될지는 중요하지 않다고 생각합니다. 처음이든 마지막이든 정의되지 않은 동작이든. 제가 아는 한 가장 큰 공통 부분은 항상 다음보다 큽니다. 다른 일반적인 부분은 많이)

예:

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

공통 부분은 A, BC및 입니다 DEF. 제가 찾고 있는 가장 큰 공통분모는 DEF1행과 2행에 불과한 것에 비해 3행 입니다 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파일을 실행하고 셸에 파이프하세요. 쉘은 공백으로 시작하는 가장 긴 줄을 찾고 해당 섹션의 첫 번째 줄 값을 보고합니다.

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

관련 정보