#!/usr/bin/perl use warnings; use strict; use Text::CSV; use 5.010; my $ops = <new ({sep_char => "\t"}); open my $opsIn, '<', \$ops or die "Cannot open file: $!"; $csv->column_names($csv->getline($opsIn)); my @ops = @{$csv->getline_hr_all($opsIn)}; close $opsIn; my %filtColumns = map {$_->{column} => 1} @ops; my @inColumns = @{$csv->getline(*DATA)}; if (grep {! exists $filtColumns{$_}} @inColumns) { die <column_names(@inColumns); $csv->combine(@inColumns); print $csv->string (), "\n"; while (my $line = $csv->getline_hr(*DATA)) { next if grep {! match($line, $_)} @ops; $csv->combine(@{$line}{@inColumns}); print $csv->string (), "\n"; } sub match { my ($line, $filter) = @_; my %fields = %$filter; my $value = $line->{$fields{column}}; given($fields{relationship}) { when ('<=') {return $value <= $fields{value}} when ('eq') {return $value eq $fields{value}} default { die "match can't handle $fields{relationship} operator\n"; } } } __DATA__ a b c 0.2 abc 0.3 0.1 abd 0.3 0.4 abe 0.2 0.1 abc 0.5 0.7 abt 0.7 0.1 abd 0.8