/combine (a695935b24a5f2789c71a8affc4486859a41f737) (2607 bytes) (mode 100755) (type blob)
#!/usr/bin/perl
=head1 NAME
combine - combine sets of lines from two files using boolean operations
=head1 SYNOPSIS
combine file1 and file2
combine file1 not file2
combine file1 or file2
combine file1 xor file2
_ file1 and file2 _
_ file1 not file2 _
_ file1 or file2 _
_ file1 xor file2 _
=head1 DESCRIPTION
B<combine> combines the lines in two files. Depending on the boolean
operation specified, the contents will be combined in different ways:
=over 4
=item and
Outputs lines that are in file1 if they are also present in file2.
=item not
Outputs lines that are in file1 but not in file2.
=item or
Outputs lines that are in file1 or file2.
=item xor
Outputs lines that are in either file1 or file2, but not in both files.
=back
"-" can be specified for either file to read stdin for that file.
The input files need not be sorted, and the lines are output in the order
they occur in file1 (followed by the order they occur in file2 for the two
"or" operations). Bear in mind that this means that the operations are not
commutative; "a and b" will not necessarily be the same as "b and a". To
obtain commutative behavior sort and uniq the result.
Note that this program can be installed as "_" to allow for the syntactic
sugar shown in the latter half of the synopsis (similar to the test/[
command). It is not currently installed as "_" by default, but you can
alias it to that if you like.
=head1 SEE ALSO
join(1)
=head1 AUTHOR
Copyright 2006 by Joey Hess <joey@kitenet.net>
Licensed under the GNU GPL.
=cut
use warnings;
use strict;
sub filemap {
my $file=shift;
my $sub=shift;
open (IN, $file) || die "$file: $!\n";
while (<IN>) {
chomp;
$sub->();
}
close IN;
}
sub hashify {
my $file=shift;
my %seen;
filemap $file, sub { $seen{$_}++ };
return \%seen;
}
sub compare_or {
my ($file1, $file2) = @_;
filemap $file1, sub { print "$_\n" };
filemap $file2, sub { print "$_\n" };
}
sub compare_xor {
my ($file1, $file2) = @_;
compare_not($file1, $file2);
compare_not($file2, $file1);
}
sub compare_not {
my ($file1, $file2) = @_;
my $seen=hashify($file2);
filemap $file1, sub { print "$_\n" unless $seen->{$_} };
}
sub compare_and {
my ($file1, $file2) = @_;
my $seen=hashify($file2);
filemap $file1, sub { print "$_\n" if $seen->{$_} };
}
if (@ARGV >= 4 && $ARGV[3] eq "_") {
delete $ARGV[3];
}
if (@ARGV != 3) {
die "Usage: combine file1 OP file2\n";
}
my $file1=shift;
my $op=lc shift;
my $file2=shift;
if ($::{"compare_$op"}) {
no strict 'refs';
"compare_$op"->($file1, $file2);
}
else {
die "unknown operation, $op\n";
}
Mode |
Type |
Size |
Ref |
File |
100644 |
blob |
44 |
5d425843f23db3bb6970a55c953f345e3a8c8fe1 |
.gitattributes |
100644 |
blob |
17989 |
b7b5f53df1412df1e117607f18385b39004cdaa2 |
COPYING |
100644 |
blob |
1038 |
377121d56b79b9fbc42cabe86f4c3bae0d44bd2f |
Makefile |
100644 |
blob |
1106 |
548acf2240b3ea1ad6276e39ec195133a8b6d4c6 |
README |
100755 |
blob |
806 |
83a4eed00f82e3bcc81856149b47cffc4091f9aa |
check-isutf8 |
100755 |
blob |
2607 |
a695935b24a5f2789c71a8affc4486859a41f737 |
combine |
040000 |
tree |
- |
eebe48e402250fe244bf2856a5f7434178808e51 |
debian |
100644 |
blob |
13073 |
2de98a0b19372bff63be861b5adc755fa52fc74d |
ifdata.c |
100644 |
blob |
7234 |
963943ee1bd1ae2ae3b087663a5e1d6cd961f246 |
ifdata.docbook |
100644 |
blob |
3006 |
d8ecea9b8bc416154533572e1ce85a0385b7af10 |
ifne.c |
100644 |
blob |
2360 |
41fa9abe7a23b63f5afd110dcd0b3f78b0e4c531 |
ifne.docbook |
100644 |
blob |
7581 |
c5f5eeb667c425c3ef02516712c08acb72f3f557 |
isutf8.c |
100644 |
blob |
2986 |
58355a2cd465fe70dd7722c28c1dc62ed85ef7e8 |
isutf8.docbook |
100644 |
blob |
5471 |
4925409bd548b058f07defe913724868801040df |
lckdo.c |
100644 |
blob |
3532 |
effe84d29436f6749b7b0614b6a59c700f287ccf |
lckdo.docbook |
100644 |
blob |
5783 |
d183d04a5f249072da9be3e1d30d4e205e1be021 |
mispipe.c |
100644 |
blob |
2464 |
bd8faa8601fe24b72f93985249be2163513f44f7 |
mispipe.docbook |
100644 |
blob |
5318 |
d283b96101fbc89ef214436bab316cf1092536f9 |
parallel.c |
100644 |
blob |
3598 |
d3ffcce639cc0880bb1aebb973354d7a6b54dbcd |
parallel.docbook |
100644 |
blob |
1040 |
6ba38f78da10b61c8670b1c450fa769248ef84c4 |
pee.c |
100644 |
blob |
2225 |
fcb159aa0f9e44536c321b92e0ad589be04fd856 |
pee.docbook |
100644 |
blob |
7301 |
a53a2cf1906998c91533f5f5435ceeeeb1a7cd59 |
physmem.c |
100644 |
blob |
8570 |
242298deb641650bd25e8b68b52ca72f82becfa4 |
sponge.c |
100644 |
blob |
1859 |
24c432ac20eb502e58cf609037a3cfa4d1dc7a5f |
sponge.docbook |
100755 |
blob |
2572 |
042cc18b8a0b4649874b229c039b7b9d79806bfc |
ts |
100755 |
blob |
4495 |
a77739f27d8cab6843471de92857fe5064f9ace4 |
vidir |
100755 |
blob |
1402 |
fd61049c5ce903a1de06870cadf18a7c2b1e4137 |
vipe |
100755 |
blob |
2518 |
98d1445a5f8106f04be690f85d802a7f6decfd13 |
zrun |
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/nicolas/debian.moreutils
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/nicolas/debian.moreutils
Clone this repository using git:
git clone git://git.rocketgit.com/user/nicolas/debian.moreutils
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main