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; }