open my $pipe, "foobar|" or die "$!\n";
print frobnicate( $_ ) while <$pipe>:
####
{
open my $in, 'foo.tsv' or die "$!\n";
my @records;
while ( <$in> ) {
next unless /^42\t/;
chomp;
push @records, join( "\t", ( split "\t" )[ 1, 3, 8 ] ) . $/;
}
open my $out, '>', 'foo_view.tsv' or die "$!\n";
print $out $_ for sort @records;
}
####
{
open my $in, 'foo.tsv' or die "$!\n";
$in = Filter::grepit( $in, qr/^42\t/ );
$in = Filter::cols ( $in, "\t", 1, 3, 8 );
$in = Filter::sortit( $in );
open my $out, '>', 'foo_view.tsv' or die "$!\n";
print $out $_ while <$in>;
}
####
sub sortit {
my ( $fh ) = shift;
return pipeit( $fh, 'sort' );
}
sub pipeit {
my ( $fh, $cmd ) = @_;
my $new_fh;
return $new_fh if my $pid = open $new_fh, '-|';
die "Fork failed: $!\n" unless defined $pid;
open my $pipe, "|$cmd" or die "Pipe failed: $!\n";
print $pipe $_ while <$fh>;
exit 0;
}
####
sub grepit {
my ( $fh, $keep ) = @_;
my $new_fh;
return $new_fh if my $pid = open $new_fh, '-|';
die "Fork failed: $!\n" unless defined $pid;
my $re = ref $keep ? $keep : qr/\Q$keep/;
/$re/ && print STDOUT while <$fh>;
exit 0;
}
sub cols {
my ( $fh, $sep, @cols ) = @_;
my $new_fh;
return $new_fh if my $pid = open $new_fh, '-|';
die "Fork failed: $!\n" unless defined $pid;
print STDOUT join( $sep, ( split $sep )[ @cols ] ), "\n"
while <$fh>;
exit 0;
}