#!/usr/bin/perl -an # field 1 # field 3,1 # field 6,2-3 # field 6- # field 2,6-,2-3 BEGIN { @ranges = split(/,/, shift); for (@ranges) { /^(\d+)$/ and push (@fields,($1-1)); /^(\d+)-(\d+)$/ and push (@fields,($1-1) .. ($2-1)); /^(\d+)-$/ and do { push (@fields,($1-1)." .. \$#F"); $must_eval = 1; }; } # Default: field 1 if(not @fields) { @fields=(1-1); } # Perl counts from 0 - not from 1 $fields = join(",", @fields); } if($must_eval) { if(not $Calc::f{$#F}) { # Eval is expensive, so only do it if we have not done before # If an argument ends in '-' then we must figure out the last field # which depends on the number of fields in the line $Calc::f{$#F}++; @{$Calc::fields->{$#F}} = eval $fields; } print join(" ",@F[@{$Calc::fields->{$#F}}]),"\n"; } else { print join(" ",@F[@fields]),"\n"; }