- ベストアンサー
ファイルの差分検出シェル教えてください
- ファイル1とファイル2で値が一致しない行番号を得る方法を教えてください。
- 2つのファイルの行数は同じです。
- 環境はHP-UXでbshです。awkは基本的なことしか知りません。詳しい方よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
入力として想定するデータの条件がややあいまいです。 1行しか変化がない、あるいは削除や挿入があるかのような相違はないというのであれば、例示されたsdiffを使った方法でも大丈夫でしょう。しかし、 101 102 103 104 105 106 101 105 102 103 104 106 という入力の場合に得たいのは 2 3 4 5 でしょうか? この場合、diff系のツールでは、105 という行の削除や挿入があったと想定してしまうため、一致しない行 2~5 を列挙させるのは簡単ではありません。 効率を考えなければ、headとtailで抜き出しては比較するというのを繰り返す処理をshでも書けますが、入力が10行以下ならともかく、システムに負担がかかるのでやめた方がいいでしょう。 入力が比較的単純で、行内に空白を含まないとか、:などの記号を含まないとかの条件があるなら、pasteコマンドで行ごとに連結して、awkで比較すればいいと思います。 paste f1 f2 | awk '$1!=$2 {print NR}' paste -d : f1 f2 | awk -F: '$1!=$2 {print NR}' それより複雑ならば、perlがインストールされているならperlで、そうでなければCで書くのがいいと思います。エラー処理はしていませんが、下のコードは一応動くと思います。 #!/usr/local/bin/perl open F1, $ARGV[0]; open F2, $ARGV[1]; for ($lineno = 1; ($l1 = <F1>) && ($l2 = <F2>); $lineno++) { if ($l1 ne $l2) { print "$lineno\n"; } } #include <stdio.h> int main(int argc, char *argv[]) { int lineno; char buf1[1024], buf2[1024]; FILE *f1, *f2; f1 = fopen(argv[1], "r"); f2 = fopen(argv[2], "r"); for (lineno = 1; fgets(buf1, 1024, f1) && fgets(buf2, 1024, f2); lineno++) if (strcmp(buf1, buf2)) printf("%d\n", lineno); return 0; }
お礼
paste f1 f2 | awk '$1!=$2 {print NR}' で成功しました。 ご丁寧にありがとうございました。