#!/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 #### Replacement Header Text Here Invoice ID Company Name 2 MASQUE SOUND 4 MASSTECH, INC 8 MASTERBILT 5 SE INTERNATIONAL 3 SEALEVEL SYSTEMS 7 SEALEVEL SYSTEMS, INC. 1 SEBASTIAN COMMUNICATIONS 6 SOUTHEAST SERVO, LLC #### # Print a new header and the column line to it print "Replacement Header Text Here\n\n"; # print the sorted data. print render($csv, @columns), "\n"; print render($csv, @$_), "\n" foreach @data_lines; sub render { my ($csv, @cells) = @_; $csv->combine(@cells); return $csv->string(); } #### Replacement Header Text Here "Invoice ID" "Company Name" 2 "MASQUE SOUND" 4 "MASSTECH, INC" 8 MASTERBILT 5 "SE INTERNATIONAL" 3 "SEALEVEL SYSTEMS" 7 "SEALEVEL SYSTEMS, INC." 1 "SEBASTIAN COMMUNICATIONS" 6 "SOUTHEAST SERVO, LLC"