![如何显示两个文件的最大公共部分?](https://linux22.com/image/163450/%E5%A6%82%E4%BD%95%E6%98%BE%E7%A4%BA%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E6%9C%80%E5%A4%A7%E5%85%AC%E5%85%B1%E9%83%A8%E5%88%86%EF%BC%9F.png)
我知道如何使用comm
或显示两个文件的每个公共行。但是我怎样才能只显示最大的公共部分,即连续的最常见的行呢?diff
grep
(如果有同样大的公共部分,我对将显示哪个部分感到无关紧要。无论是第一个、最后一个还是未定义的行为。就我而言,最大的公共部分总是比任何其他公共部分大得多。 )
例子:
A
B
C
D
E
F
G
A
X
D
E
F
B
C
公共部分是A
、BC
和DEF
。我正在寻找的最大共同点是DEF
3 行与只有 1 行和 2 行的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
您的文件并将其通过管道传输到 shell 中。 shell 只是查找以空格开头的最长的行,并报告该部分第一行的值:
$ diff -u999999 file1 file2 | ./foo.sh
the largest section is 3 lines starting with 'D'