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
この方法は、2つのファイルの全体的な違いを単一のコンテキストに配置することに基づいています。したがって、両方のファイルが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'