Ignore Header and Footer and Sort the data in fixed width file

Hi Experts,

I want to Sort the data in fixed width file where i have Header and Footer also in file.

I m using below commad to do the sort based on field satarting from 15 position to 17 position , but it is not ignoring the Header and Footer of the file while sorting. In the output i am getting both header and footer coming in first and then the data. It is sorting header and footer records also.

egrep -iv 'head|trail' input_file | sort -t'|' -k1.15,1.17 > output_file

HDD1000000000000220110713AMP 8.3
A100020110712ZZT1K9000A
A100020110712ZZT1J9000L
A100020110712ZZI1G9000A
A100020110712ZZT1M9000L
A100020110712ZZ O9000A
A100020110712ZZ O9000A
A100020110712ZZI1O9000A
A100020110712ZZI1W9000L
TDD1000000000000220110713010113000008

HDD1000000000000220110713AMP 8.3
A100020110712ZZ O9000A
A100020110712ZZ O9000A
A100020110712ZZI1G9000A
A100020110712ZZI1O9000A
A100020110712ZZI1O9000A
A100020110712ZZI1W9000L
A100020110712ZZT1M9000L
A100020110712ZZT1K9000A
A100020110712ZZT1J9000L
TDD1000000000000220110713010113000008

Please suggest me on how to sort the data by ignoring header and footer in a file.

Thanks in Advance !
Regards,
-Sasi

Not pretty but...

H=$(head -1 infile)
$> T=$(tail -1 infile)
$> echo $H; sed '1d;$d' infile| sort -t'|' -k1.15,1.17; echo $T
HDD1000000000000220110713AMP 8.3
A100020110712ZZI1G9000A
A100020110712ZZI1O9000A
A100020110712ZZI1W9000L
A100020110712ZZ O9000A
A100020110712ZZ O9000A
A100020110712ZZT1J9000L
A100020110712ZZT1K9000A
A100020110712ZZT1M9000L
TDD1000000000000220110713010113000008

Since my edit function is not working - here a short addition: The delimeter with sort ("|") is not used, you can leave it out in your example.

Thanks for the Reply.

When i am trying to capture the output from the sorted file i m just getting only the Trailer record, using below code.

Could you please suggest me how to capture the output i.e sorted file which is having both Header and Footer.

echo $H; sed '1d;$d' input_file | sort -t'|' -k1.15,1.17; echo $T > output_sorted_file

Basically my output should be a sorted file with Header and Footer.

Thanks in Advance !
-Sasi

There is 3 commands producing output so you would have to redirect 3 times:

echo $H > newfile; sed '1d;$d' infile| sort -t'|' -k1.15,1.17 >> newfile; echo $T >> newfile

You could alternatively redirect stdout to a file before starting the commands above, then reset it to your terminal:

H=$(head -1 infile)
T=$(tail -1 infile)
exec 1> newfile        careful, all following output to stdout will now be redirected into that file "newfile" until reset!
echo $H; sed '1d;$d' infile| sort -t'|' -k1.15,1.17; echo $T
exec 1> /dev/tty       resetting stdout to your terminal

Check your file "newfile" now.

1 Like

Thanks for the reply and its working fine now in UNIX.

As my design is changed to handle the same logic in PERL script ,Could someone explain how to handle the same logic in PERL code.

Regards
-Sasi