差分出力で正しい行数を取得する


8

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 ません

回答:


13

改行はないのでwc -l正しいです。代わりに、行頭の数を数えます。それを行う1つの方法:

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

3

間違いではありません。行はLF文字で終了する必要があります。そうでなければ、それは行ではありません(とにかく、行wc -lではなく改行文字を数えるように文書化されています)。

欠落しているLF文字を追加する何かに出力をパイプすることができます。GNU pasteはそれを行います:

$ 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固有のオプションをdiffに使用しているので、おそらくGNU pasteも使用していると想定できます。終了していない行に対するテキストユーティリティの動作は、POSIXでは規定されていません。


0

manページとinfoページで述べたように、改行文字の数を出力するための-l--lines)オプションのようwcです。したがって、行が改行文字で終わっていない場合、カウントは増分されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.