困ったときのdiffコマンド!同一ファイル内でdiffをとる方法

Shell

同一ファイル内でdiffをとるコマンドについてまとめました。

結論

コマンド

diff -u <(sed -n [開始行番号],[終了行番号]p [ファイル名]) <(sed -n [開始行番号],[終了行番号]p [ファイル名])

使用例

ファイル(test.txt)の中身

aaaaa
bbbbb

aacaa
bbbeb

コマンド

diff -u <(sed -n 1,2p ./test.txt) <(sed -n 4,5p ./test.txt)

実行結果

$ diff -u <(sed -n 1,2p ./test.txt) <(sed -n 4,5p ./test.txt)
--- /dev/fd/63  2023-05-31 08:18:30.290596341 +0900
+++ /dev/fd/62  2023-05-31 08:18:30.290596341 +0900
@@ -1,2 +1,2 @@
-aaaaa
-bbbbb
+aacaa
+bbbeb

同一ファイル内でのdiffをとるとは

先日とてつもなく長いファイルに出会いました。
このファイルには、同じような記述だけど、微妙に値が異なるケースがあり、
レビューするのに困っていました。
(微妙な差異を目視で判断するのは大変かつ事故の元になりかねない)

どうにかコマンドで実現できないかと本コマンドを作成しました。
もしほかにも同一ファイル内のdiffをとりたい方がいれば、ご参考いただければと思います。

コマンドの解説

diff

diff -u

diffは言わずもがな、ファイルの差分を取得するコマンドです。
-uオプションは、「Unified Format(統一形式)」と呼ばれるもので、差分行が先頭に「-」または「+」の記号とともに表示され、先頭に2つのファイル名が表示されます。
差分がみやすくなるので、普段のdiffからつけることをおすすめします。

sed

sed -n 1,2p ./test.txt

sedコマンドは、指定したファイルを標準出力に出力するコマンドです。
-nオプションは、出力コマンド以外の出力を行わないという意味です。
-n 1,2pとすることで、1行目と2行目だけを標準出力に出力できます。

プロセス置換

<(sed -n 1,2p ./test.txt)

プロセス置換とは標準出力をファイルのように扱うことができる機能で<()とすることで使用できます。
比較対象が両方とも標準出力に対してdiffをする場合、プロセス置換を使うことで比較できます。

まとめ

いかがでしたでしょうか?
同じように長いファイルのdiffに困っている方の助けになれば幸いです

コメント

タイトルとURLをコピーしました