comm
두 파일의 모든 공통 행을 사용하거나 표시하는 방법을 알고 있습니다 . 그런데 가장 큰 공통 부분, 즉 가장 일반적인 행만 연속으로 표시하려면 어떻게 해야 합니까?diff
grep
(동일하게 큰 공통 부분이 있는 경우 어떤 부분이 표시될지는 중요하지 않다고 생각합니다. 처음이든 마지막이든 정의되지 않은 동작이든. 제가 아는 한 가장 큰 공통 부분은 항상 다음보다 큽니다. 다른 일반적인 부분은 많이)
예:
A
B
C
D
E
F
G
A
X
D
E
F
B
C
공통 부분은 A
, BC
및 입니다 DEF
. 제가 찾고 있는 가장 큰 공통분모는 DEF
1행과 2행에 불과한 것에 비해 3행 입니다 A
.BC
답변1
이 방법은 두 파일의 전체 차이점을 단일 컨텍스트에 넣는 것을 기반으로 합니다. 따라서 두 파일 모두 999,999줄보다 길지 않다고 가정합니다.
./foo.sh
755 에 대해 다음 스크립트를 만듭니다 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'