Files
percona-toolkit/bin/pt-align
Daniel Nichter a9e002cc5a Add Aspersa tools, their tests, and util/test-bash-tool.
Update and simplify copyright notices.
2011-07-01 10:29:50 -06:00

128 lines
4.2 KiB
Perl
Executable File

#!/usr/bin/env perl
# This program is copyright 2010 Baron Schwartz, 2011 Percona Inc.
# Feedback and improvements are welcome.
#
# THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, version 2; OR the Perl Artistic License. On UNIX and similar
# systems, you can issue `man perlgpl' or `man perlartistic' to read these
# licenses.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA.
use strict;
use warnings FATAL => 'all';
# Finds the max element in the list
sub max {
my $i = shift @_;
foreach my $n ( @_ ) {
$i = $n if $n > $i;
}
return $i;
}
# Read all lines
my @lines;
my %word_count;
while ( <> ) {
my $line = $_;
my @words = $line =~ m/(\S+)/g;
push @lines, \@words;
$word_count{ scalar @words }++;
}
# Find max number of words per line
my @wc = reverse sort { $word_count{$a}<=>$word_count{$b} } keys %word_count;
my $m_words = $wc[0];
# Filter out non-conformists
@lines = grep { scalar @$_ == $m_words } @lines;
die "I need at least 2 lines" unless @lines > 1;
# Find the widths and alignments of each column
my @fmt;
foreach my $i ( 0 .. $m_words-1 ) {
my $m_len = max(map { length($_->[$i]) } @lines);
my $code = $lines[1]->[$i] =~ m/[^0-9.-]/ ? "%-${m_len}s" : "%${m_len}s";
push @fmt, $code;
}
my $fmt = join(' ', @fmt) . "\n";
# Print!
foreach my $l ( @lines ) {
printf $fmt, @$l;
}
# ############################################################################
# Documentation
# ############################################################################
=pod
=head1 NAME
pt-align - Read lines and split them into words.
=head1 SYNOPSIS
Usage: pt-align [OPTION...]
=head1 DESCRIPTION
This program reads in lines and splits them into words. It counts how many
words each line has, and if there is one number that predominates, it assumes
this is the number of words in each line. Then it discards all lines that
don't have that many words, and looks at the 2nd line that DOES. It assumes
this is the first non-header line. Based on whether each word looks numeric
or not, it decides on column alignment. Finally, it goes through and decides
how wide each column should be, and then prints them out.
This is useful for things like aligning the output of vmstat or iostat so it
is easier to read.
=head1 COPYRIGHT, LICENSE, AND WARRANTY
This program is copyright 2010 Baron Schwartz, 2011 Percona Inc.
Feedback and improvements are welcome.
THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, version 2; OR the Perl Artistic License. On UNIX and similar
systems, you can issue `man perlgpl' or `man perlartistic' to read these
licenses.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA.
=head1 AUTHORS
Baron Schwartz
=head1 ABOUT PERCONA TOOLKIT
This tool is part of Percona Toolkit, a collection of advanced command-line
tools used by Percona for MySQL support and consulting. Percona Toolkit
was forked from two projects in June, 2011: Maatkit and Aspersa. Those
projects were created by Baron Schwartz and developed primarily by him and
Daniel Nichter, both of whom are employed by Percona. Financial support for
Percona Toolkit development is provided by Percona and its clients. Visit
L<http://www.percona.com/software/> for more projects developed by Percona.
=head1 VERSION
This manual page documents Ver @VERSION@ Distrib @DISTRIB@ $Revision: 7531 $.
=cut