diff出力で正しい行数を取得してください。

diff出力で正しい行数を取得してください。

diff出力で正しい行数を取得したいです(特にオプションを使用)-y--suppress-common-lines簡単なwc -l方法を使用してくださいいいえ両方のファイルが改行なしで終了し、最後の行が異なる場合は、最後の行が計算されないwc -lために機能します。

これを防ぐための簡単で効果的な解決策はありますか?

たとえば、「a」ファイルがある場合:

a
b
c
d   #no newline here

と「b」:

a
b
c
D    #no newline here

出力は次のとおりです

$ diff -y --suppress-common-lines a b | wc -l
0

これは明らかに間違った内容なのでdiff する1行を出力します。

答え1

改行文字がないのでwc -l正確です。代わりに、行の開始数を数えたいと思います。 1つの方法は次のとおりです。

$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1

答え2

それは何の問題もありません。行はLF文字で終わる必要があります。それ以外の場合は行ではありません(とにかく行ではwc -lなく改行回数として記録されます)。

欠落しているLF文字を再追加する項目に出力をパイプできます。 GNUペーストは次のことができます。

$ diff -y --suppress-common-lines <(printf a) <(printf b) | wc -l
0
$ diff -y --suppress-common-lines <(printf a) <(printf b) | paste | wc -l
1

他の貼り付け実装では機能しない可能性がありますが、GNU固有のオプションを使用しているため、GNUもあるとdiff安全に想定できますpaste。 POSIX は、終了しない行に対するテキストユーティリティの動作を指定しません。

答え3

マニュアルと情報ページに記載されているように、-l()オプションは改行回数を印刷する--linesために使用されるようです。wcしたがって、行が改行文字で終わらない場合、数は増えません。

関連情報