Dies unterscheidet sich also geringfügig von den anderen Antworten. Ich kann nicht sagen, dass ein C ++ - Compiler genau ein "Linux CLI-Tool" ist, aber das Ausführen g++ -O3 -march=native -o set_diff main.cpp
(mit dem folgenden Code main.cpp
kann den Trick machen):
#include<algorithm>
#include<iostream>
#include<iterator>
#include<fstream>
#include<string>
#include<unordered_set>
using namespace std;
int main(int argc, char** argv) {
ifstream keep_file(argv[1]), del_file(argv[2]);
unordered_multiset<string> init_lines{istream_iterator<string>(keep_file), istream_iterator<string>()};
string line;
while (getline(del_file, line)) {
init_lines.erase(line);
}
copy(init_lines.begin(),init_lines.end(), ostream_iterator<string>(cout, "\n"));
}
Zur Verwendung einfach ausführen set_diff B A
( nicht A B
, da B
ist nodes_to_keep
) und der resultierende Unterschied wird auf stdout gedruckt.
Beachten Sie, dass ich auf einige bewährte Methoden für C ++ verzichtet habe, um den Code einfacher zu halten.
Es könnten viele zusätzliche Geschwindigkeitsoptimierungen vorgenommen werden (zum Preis von mehr Speicher). mmap
wäre auch besonders nützlich für große Datenmengen, aber das würde den Code viel komplizierter machen.
Da Sie erwähnt haben, dass die Datenmengen groß sind, hielt ich das Lesen nodes_to_delete
einer Zeile gleichzeitig für eine gute Idee, um den Speicherverbrauch zu reduzieren. Der im obigen Code verfolgte Ansatz ist nicht besonders effizient, wenn sich viele Dupes in Ihrem befinden nodes_to_delete
. Auch die Ordnung bleibt nicht erhalten.
Etwas, das einfacher zu kopieren und einzufügen ist bash
(dh die Erstellung von überspringt main.cpp
):
g++ -O3 -march=native -xc++ -o set_diff - <<EOF
#include<algorithm>
#include<iostream>
#include<iterator>
#include<fstream>
#include<string>
#include<unordered_set>
using namespace std;
int main(int argc, char** argv) {
ifstream keep_file(argv[1]), del_file(argv[2]);
unordered_multiset<string> init_lines{istream_iterator<string>(keep_file), istream_iterator<string>()};
string line;
while (getline(del_file, line)) {
init_lines.erase(line);
}
copy(init_lines.begin(),init_lines.end(), ostream_iterator<string>(cout, "\n"));
}
EOF