#!/usr/bin/perl use strict; use warnings; use Text::CSV; use 5.016; my $csv = Text::CSV->new({binary => 1, sep_char => "\t"}); my $row; 1 while $row = $csv->getline(*DATA) and $row->[0] !~ /Invoice ID/; my @columns = @$row; my @data_lines; push @data_lines, $row while $row = $csv->getline(*DATA); # Sort data according to "Company Name" field then "Invoice ID" field. my ($company_name_index) = grep {$columns[$_] eq "Company Name"} (0 .. $#columns); my ($invoice_ID_index) = grep {$columns[$_] eq "Invoice ID"} (0 .. $#columns); @data_lines = sort { fc($a->[$company_name_index]) cmp fc($b->[$company_name_index]) or $a->[$invoice_ID_index] <=> $a->[$invoice_ID_index] } @data_lines; # Print a new header and the column line print "Replacement Header Text Here\n\n", join ("\t", @columns), "\n"; # then print the sorted data print join ("\t", @$_), "\n" foreach @data_lines; __DATA__ Original Header Text Invoice ID Company Name 1 SEBASTIAN COMMUNICATIONS 2 MASQUE SOUND 3 SEALEVEL SYSTEMS 4 "MASSTECH, INC" 5 SE INTERNATIONAL 6 "SOUTHEAST SERVO, LLC" 7 "SEALEVEL SYSTEMS, INC." 8 MASTERBILT