どのようにして2つのファイル間にdiff文字のみを得ることができますか?例えば 2つのファイルのマージされた違いを表示するにはどうすればよいですか?
、FILE1:
aaa;bbb;ccc 123;456;789 a1a;b1b;c1c
FILE2:
aAa;bbb;ccc 123;406;789 a1a;b1b;c5c
diffをした後、私は目の相違のみ、この文字列を取得する必要がありますe第2ファイル:A05
どのようにして2つのファイル間にdiff文字のみを得ることができますか?例えば 2つのファイルのマージされた違いを表示するにはどうすればよいですか?
、FILE1:
aaa;bbb;ccc 123;456;789 a1a;b1b;c1c
FILE2:
aAa;bbb;ccc 123;406;789 a1a;b1b;c5c
diffをした後、私は目の相違のみ、この文字列を取得する必要がありますe第2ファイル:A05
たとえば、 の場合、文字をファイルごとに比較することができます。違いがある場合は、2番目のファイルの文字を印刷します。これを行う方法は次のとおりです。
paste <(fold -w1 file1) <(fold -w1 file2) | \
while read c1 c2; do [[ $c1 = $c2 ]] || printf $c2; done
この例では、これはA05
と表示されます。
diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2) |
sed 's/.*\(.\)$/\1/' | paste -s -d '' -
これは、1つの文字広いですし、その後diff
と比較する文字列の中に各ファイルをオンにするfold
とプロセス置換を使用しています。
-y
オプションは、隣り合った行を印刷し、--suppress-common-lines
は、両方のファイル間で同じ行をスキップします。これまでの出力は次のようになります。
$ diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2)
a | A
5 | 0
1 | 5
各行の最後の文字にのみ関心があります。 (シリアル)-s
オプションと区切り文字(-d ''
)として空の文字列でpaste
に
$ diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2) |
> sed 's/.*\(.\)$/\1/'
A
0
5
は1行にこれらを取得するために、我々パイプ:我々は残りの部分を破棄するsedを使用しています。ダッシュで標準から読み取るpaste
を伝え
$ diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2) |
> sed 's/.*\(.\)$/\1/' | paste -s -d '' -
A05
代わり、あなたはあなたの処分でGNUのdiffutilsを持っている場合、cmp
です。
$ cmp -lb file1 file2 | awk '{print $5}' | tr -d '\n'
A05
cmp
ファイルはバイト単位で比較します。 -l
オプション( "詳細")は、最初のものだけでなく、すべての相違点を表示します。 -b
オプションは、それが異なるバイトのASCIIの解釈を追加します
$ cmp -lb file1 file2
2 141 a 101 A
18 65 5 60 0
34 61 1 65 5
awkコマンドは、5列目には、この出力を減少させ、そしてtr
は、改行を削除します。