Ищу скрипт форматирования столбца, я чувствую, что это может быть однострочный awk. В идеале мне нужен небольшой сценарий оболочки.
Данные разделены табуляцией, каждая ячейка в каждой строке имеет переменную длину и, конечно же, может содержать пробелы.
Итак, у нас есть что-то вроде этого
dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas e dward das dsaw das daswf fjdk ewf jken dsajkw dskdw hklt ewq vn1 daskcn daskw
Должно получиться что-то вроде этого:
dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas e dward das dsaw das daswf fjdk ewf jken dsajkw dskdw hklt ewq vn1 daskcn daskw
В идеале, иметь возможность регулировать количество жестких промежутков между ними. Еще лучше, если он будет выглядеть по столбцам, поэтому не все ведущие короткие ячейки получают одинаковое правильное заполнение.
Не идеально:
1 dhsahdwe dhasdhajks ewqhehwq dsajkdhas 2 das dsaw das daswf 3 ewf jken dsajkw dskdw 4 ewq vn1 daskcn daskw
Идеально:
1 dhsahdwe dhasdhajks ewqhehwq dsajkdhas 2 das dsaw das daswf 3 ewf jken dsajkw dskdw 4 ewq vn1 daskcn daskw





В необъясненном Perl:
#!/usr/bin/perl -w
use strict;
my (@data, @length);
while (<>) {
chomp;
my @line = split(/\t/);
foreach my $i (0 .. $#line) {
my $n = length($line[$i]);
$length[$i] = $n if (!defined($length[$i]) || $n > $length[$i]);
}
push(@data, [ @line ]);
}
$length[$#length] = 0; # no need to pad the last column
my $fmt = join(" ", map { "%-${_}s" } @length) . "\n";
foreach my $ref (@data) {
printf $fmt, @$ref;
}
Ну вот. Проверено с помощью gawk.
BEGIN {
FS = "\t";
# max: Column width
# fpl: Fields per line
# data: Fields in every line
}
{ # Note the blank before this brace
fpl[FNR] = NF;
for (i=1; i<=NF; i++) {
data[FNR, i] = $i;
if (length($i) > max[i]) {
max[i] = length($i);
}
}
}
END {
for (l=1; l<=length(fpl); l++) {
for (i=1; i<=fpl[l]; i++) {
fmt = "%-" max[i] "s";
if (i > 1) {
printf " "; # This goes between columns
}
printf fmt, data[l, i];
}
printf "\n";
}
}
Если вы используете ОС на основе BSD (включая Mac OS X), столбец (1) и его параметр -t могут делать то, что вы хотите:
% column -t coltest
dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas
e dward das dsaw das daswf
fjdk ewf jken dsajkw dskdw
hklt ewq vn1 daskcn daskw
может также захотеть добавить параметры -s, чтобы ограничить разделители столбцов. По умолчанию пробел и табуляция могут разделять столбцы. Я почти пошел с gawk answer, пока не увидел это. спасибо за простое решение!