2つのファイルがあります。あるファイルが別のファイルのサブセットであるようです。 2番目のファイルが最初のファイル内にある場所を簡潔に識別するためにファイルを比較する方法はありますか?
答え1
diff -e bigger smaller
トリックを実行しますが、出力は「有効な編集スクリプト」なので、いくつかの説明が必要です。
「bigger」と「smaller」という2つのファイルを作成しました。ここで「smaller」の内容は「bigger」の5~9行と同じで、「diff -eより大きいより小さい」を実行すると次のような結果が得られます。
% diff -e bigger smaller
10,15d
1,4d
これは、「より大きい」行10〜15を削除してから「より小さい」行1〜4を削除することを意味します。これは、「より小さい」が「より大きい」行の5〜9行目であることを意味します。
ファイル名を変更すると、状況がより複雑になりました。 「より小さい」が「より大きい」のサブセットを形成する場合、「d」(削除用)コマンドのみが出力に表示されます。
答え2
視覚的にこれを行うことができます。フュージョン。残念ながらこれはGUIツールですが、比較的小さなファイルで一度だけ実行したい場合は問題ありません。
下の図は出力ですmeld a b
。
答え3
ファイルが十分に小さい場合は、Perlにすべて入れて、その正規表現エンジンにアクションを実行させることができます。
perl -0777e '
open "$FILE1","<","file_1";
open "$FILE2","<","file_2";
$file_1 = <$FILE1>;
$file_2 = <$FILE2>;
print "file_2 is", $file_1 =~ /\Q$file_2\E/ ? "" : "not";
print " a subset of file_1\n";
'
このスイッチは、ファイルを完全に読み取るために、-0777
Perlに入力レコード区切り文字を未定義の値に設定するように指示します。$/
答え4
問題は「差分ファイルヘッダー」です。あるファイルが別のファイルのヘッダーであることを意味する場合は、簡単な方法cmp
で次のことがわかります。
cmp big_file small_file
cmp: EOF on small_file
これは、読み込み中にファイルの終わりに達するまで、2つのファイル間の違いが検出されないことを示しますsmall_file
。
しかし、小さなファイルのフルテキストが内部のどこにでも表示されることを意味し、big_file
両方のファイルをメモリに入れることができると仮定すると、次のようになります。
perl -le '
use autodie;
undef $/;
open SMALL, "<", "small_file";
open BIG, "<", "big_file";
$small = <SMALL>;
$big = <BIG>;
$pos = index $big, $small;
print $pos if $pos >= 0;
'
big_file
これにより、コンテンツが配置されている位置のオフセットが印刷されます(たとえば、small_file
先頭に一致する場合は0)。内部の不一致があると、何も印刷されません。エラーが発生した場合、終了ステータスはゼロではありません。small_file
big_file
small_file
big_file