#!/usr/bin/perl use strict; use warnings; my (@header,%data); while () { if (/^n10/) { push @header, 'total'; } # will it always be total? elsif (/^n01([^;]+);/) { push @header, $1; $data{$1} = "x"; } print; } $data{'total'} = "x"; # maybe compute a sum here instead :) print join(' ', "g", @header), "\n"; print join(' ', "g", map { '-' x length($_) } @header), "\n"; print join(' ', "p", map { sprintf("%*s ", length($_)-1, $data{$_}) } @header), "\n"; __DATA__ line1 line2 n10total n01chocoloate;more stuff n01vanilla;more stuff