Ich versuche herauszufinden, ob eine Textdatei eine Teilmenge einer anderen ist.
Beispielsweise:
foo
bar
ist eine Teilmenge von
foo
bar
pluto
Während:
foo
pluto
und
foo
bar
sind keine Untergruppe voneinander ...
Gibt es eine Möglichkeit, dies mit einem Befehl zu tun?
Diese Prüfung muss eine Gegenprüfung sein und Folgendes zurückgeben:
file1 subset of file2 : True
file2 subset of file1 : True
otherwise : False
Antworten:
Wenn diese Dateiinhalte aufgerufen
file1
werdenfile2
undfile3
in der Reihenfolge ihres Erscheinens, können Sie dies mit dem folgenden Einzeiler tun:quelle
in
Operators zu sein.Mit
perl
:-0octal
Definiert den Datensatzbegrenzer. Wenn diese Oktalzahl größer als 0377 (der maximale Bytewert) ist, bedeutet dies, dass es keinen Begrenzer gibt. Dies entspricht dem Vorgang$/ = undef
. In diesem Fall wird<>
der vollständige Inhalt einer einzelnen Datei zurückgegeben. Dies ist der Slurp-Modus .Sobald wir den Inhalt der Dateien in zwei
$h
und$n
Variablen haben, können wirindex()
feststellen, ob eine in der anderen gefunden wird.Dies bedeutet jedoch, dass die gesamten Dateien im Speicher abgelegt werden, was bedeutet, dass die Methode bei sehr großen Dateien nicht funktioniert.
Für mmappable-Dateien (enthält normalerweise reguläre Dateien und am meisten durchsuchbare Dateien wie Block-Geräte), die durch Verwendung
mmap()
der Dateien wie mit demSys::Mmap
Perl-Modul umgangen werden können:quelle
Dank dieser Frage habe ich eine Lösung gefunden
Grundsätzlich teste ich zwei Dateien
a.txt
undb.txt
mit diesem Skript:Wenn man von der anderen Skript Rückkehr Teilmenge
0
fürTrue
sonst1
.quelle
%L
, es war vor drei Jahren. Fromman diff
(aktuelle Version)%L
bedeutet "Zeileninhalt".Wenn f1 eine Teilmenge von f2 ist, dann ist f1 - f2 eine leere Menge. Darauf aufbauend können wir eine is_subset-Funktion und eine davon abgeleitete Funktion schreiben. Gemäß Satzunterschied zwischen 2 Textdateien
quelle
#!/bin/bash
?Von http://www.catonmat.net/blog/set-operations-in-unix-shell/ :
quelle