İ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ı?
İ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ı?
Yanıtlar:
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.
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
:
vimdiff
Terminalde bulunan çok benziyor .
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";
'
-0777
Perl talimatını anahtarı onun giriş kayıt ayırıcı ayarlamak için $/
tamamen slurp dosyaları şekilde tanımlanmamış değere.
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.
$a=<$fh>
yine de slurp gerekir mi?
$/
hiç kümesidir \n
, böylece $a=<$fh>
dosyanın sadece bir satır okurdum $fh
açılmıştır. Tabii ki perl
komut satırı davranışı farkında olmadığım farklı varsayılanlar sürece ?
while $foo=<FILE>
deyim kullanmıyorum, bu yüzden emin değildi ve işe yarayan bir (yanlış) testi koştu. Boşver :).
Dosyaları metin dosyaları ve varsa smaller
içinde, bigger
bir 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
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_file
iki 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_file
bulunduğu konumdaki ofseti yazdırır (örneğin small_file
, başlangıcında eşleşiyorsa 0 big_file
). Eğer small_file
içeride uymuyor big_file
, sonra hiçbir şey yazdırılır. Bir hata varsa, çıkış durumu sıfırdan farklı olacaktır.