NAME|AGE|CITY|ZIP AAA|23|STAT|60001 BBB|34|PPOR|12345 CCC|11|TRET|2345 #### NAME|CITY AAA|STAT BBB|PPOR CCC|TRET #### #!/usr/bin/perl use warnings; use strict; use List::Util qw( first ); my @master_cols = qw( NAME CITY ); my @results; my %positions; while ( my $line = ){ chomp $line; my @row = split /\|/, $line; if ( $. == 1 ){ while ( my ( $i, $elem ) = each @row ){ if ( first { $elem eq $_ } @master_cols ){ $positions{ $elem } = $i; } } } my @row_items; for my $pos ( sort values %positions ){ push @row_items, $row[ $pos ]; } push @results, [ @row_items ]; } for my $result ( @results ){ print "\n"; print join '|', @{ $result }; } __DATA__ NAME|AGE|CITY|ZIP AAA|23|STAT|60001 BBB|34|PPOR|12345 CCC|11|TRET|2345