Farklı Dosya Başkanı


11

İki dosyam var. Şüphelendiğim bir dosya diğerinin alt kümesidir. İlk dosyanın ikinci dosyanın nereye oturduğunu tanımlamak için (özlü bir şekilde) dosyaları dağıtmanın bir yolu var mı?



Yani bir dosyanın satırları diğerinin alt dizisi mi yoksa aslında bitişik bir alt dize mi?
Kaz

Bitişik bir alt dize, @Kaz.
Richard

Yanıtlar:


14

diff -e bigger smaller hile yapacaktır, ancak çıktı bir "geçerli ed betiği" olduğundan biraz yorum gerektirir.

Ben "küçük" içeriği "diff -e daha büyük daha küçük" yapan "büyük" 5 ila 9 satırları ile aynı olduğu, "büyük" ve "küçük" iki dosya yaptım:

% diff -e bigger smaller
10,15d
1,4d

Bu da "daha büyük" olan 10'dan 15'e kadar olan satırları sil ve daha sonra "daha küçük" olmak için 1'den 4'e kadar olan satırları sil "anlamına gelir. Bunun anlamı "küçük", "büyük" ün 5 ila 9 satırlarıdır.

Dosya adlarını tersine çevirmek bana daha karmaşık bir şey kazandırdı. Eğer "küçük" gerçekten "büyük" bir alt kümeyi oluşturuyorsa, çıktıda sadece 'd' (silme) komutları görünecektir.


5

Bunu meld ile görsel olarak yapabilirsiniz . Ne yazık ki, bir GUI aracıdır, ancak bunu sadece bir kez ve nispeten küçük bir dosyada yapmak istiyorsanız, iyi olmalıdır:

Aşağıdaki resim çıktısıdır meld a b:

resim açıklamasını buraya girin


1
Meld güzel, ama 100MB + dosyalarla pek iyi oynamıyor.
Richard

@Richard hayır değil ve yine de bir komut satırı aracını tercih ederim, sadece bahsettiğimi düşündüm.
terdon

vimdiffTerminalde bulunan çok benziyor .
Patrick

2

Dosyalar yeterince küçükse, bunları Perl'e karıştırabilir ve regex motorunun hile yapmasını sağlayabilirsiniz:

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";
'

-0777Perl talimatını anahtarı onun giriş kayıt ayırıcı ayarlamak için $/tamamen slurp dosyaları şekilde tanımlanmamış değere.


1
Ne yapar 777? Sanırım NULL olarak geçiyorsun $/ama neden? Ayrıca bunlar ezoterik anahtarlar olduğu için, perl olmayan insanlar için bir açıklama iyi olurdu.
terdon

1
@terdon Gerçekten bütün dosyaları karıştırmak için yapıyorum. Açıklama eklendi.
Joseph R.

Ama bu neden gerekli? $a=<$fh>yine de slurp gerekir mi?
terdon

1
@terdon Bildiğimden değil, hayır. Varsayılan olarak $/hiç kümesidir \n, böylece $a=<$fh>dosyanın sadece bir satır okurdum $fhaçılmıştır. Tabii ki perlkomut satırı davranışı farkında olmadığım farklı varsayılanlar sürece ?
Joseph R.

Argh, evet, benim kötü, ben neredeyse hiç dosyaları slurp veya while $foo=<FILE>deyim kullanmıyorum, bu yüzden emin değildi ve işe yarayan bir (yanlış) testi koştu. Boşver :).
terdon

1

Dosyaları metin dosyaları ve varsa smalleriçinde, biggerbir satırın başında başlar, onunla uygulamak çok zor değil awk:

awk -v i=0 'NR==FNR{l[n++]=$0;next}
    {if ($0 == l[i]) {if (++i == n) {print FNR-n+1;exit}} else i=0}
    ' smaller bigger

1

Sorunuz "Diff dosya başı". Gerçekten bir dosyanın diğerinin başı olduğunu kastediyorsanız, basit bir cmpşey size şunu söyleyecektir:

cmp big_file small_file
cmp: EOF on small_file

Bu, okuma sırasında dosya sonuna ulaşılana kadar iki dosya arasındaki farkın tespit edilmediğini gösterir small_file.

Bununla birlikte, küçük dosyanın tüm metninin içeride herhangi bir yerde olabileceğini kastediyorsanız, her big_fileiki dosyayı da belleğe sığdırabileceğinizi varsayarsak,

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;
'

Bu big_file, içeriğinin small_filebulunduğu konumdaki ofseti yazdırır (örneğin small_file, başlangıcında eşleşiyorsa 0 big_file). Eğer small_fileiçeride uymuyor big_file, sonra hiçbir şey yazdırılır. Bir hata varsa, çıkış durumu sıfırdan farklı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.