#!/usr/bin/perl use utf8; use 5.022; use strict; # Open the file for input, discard all the header lines, but stop on and save the column names in an array. # Then read all the remaining lines in to an array and close the file. my $filename = "test.txt"; my $fh; open($fh, "<", $filename) or die "Cannot open \"$filename\" for input: $!\n"; my $column_line = ""; $column_line = <$fh> while !($column_line =~ /Invoice ID/i); chomp(my @columns = split /\t/, $column_line); chomp(my @data_lines = <$fh>); close $fh; # Sort the data lines according to the "Company Name" field, and then the "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 { my($company_name_a, $invoice_ID_a) = (split /\t/, $a)[$company_name_index, $invoice_ID_index]; my($company_name_b, $invoice_ID_b) = (split /\t/, $b)[$company_name_index, $invoice_ID_index]; fc($company_name_a) cmp fc($company_name_b) or $invoice_ID_a <=> $invoice_ID_b } @data_lines; # Open the file for output, print the standard header to it, print the now sorted data to it, then close the file. open($fh, ">", $filename) or die "Cannot open \"$filename\" for output: $!\n"; print $fh "Replacement Header Text Here\n\n$column_line"; print $fh "$_\n" foreach @data_lines; #### 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 4 MASSTECH, INC 7 SEALEVEL SYSTEMS, INC. 6 SOUTHEAST SERVO, LLC 2 MASQUE SOUND 8 MASTERBILT 5 SE INTERNATIONAL 3 SEALEVEL SYSTEMS 1 SEBASTIAN COMMUNICATIONS