Это просто с небольшим количеством взлома. Вот как я это делал, когда мне нужно было нечто подобное в прошлом (но для того, чтобы сделать это правильно, вам нужно сначала узнать общее количество строк в вашем файле и прекратить захватывать строки после конца строк, в противном случае вам нужно нажать ctrl-c для завершения цикл, и вы потеряете последнюю строку, если у вас нет $ tot_lines% $ col_num == 0)
perl -lne '$|=1; $c1= $_; $c2=scalar <>; $c3=scalar <>; \
chomp($c1, $c2, $c3); \
print join("|", $c1, $c2, $c3); \
' \
long_text_60_chars.txt \
| less
Это простой ответ, когда входные линии разбросаны по линии.
[примечание] вам нужно отменить буфер печати, если вы хотите передать его на less
(из-за ожидания ввода <>
когда меньше строк, чем хотелось <>
)
Вы усложняете себя и хотите, чтобы строки были разбиты по столбцам, но тогда вам нужно знать размер строк пейджера и общее количество строк в вашем файле. Для пейджера на 50 строк:
perl -lne 'BEGIN{$|=1; $max = 1301; $cl = 50; $pl = $cl*3; $pleft=$max % $pl; $cleft=$max % $cl; $pmax=$max - $pleft; $cmax=$max - $cleft; print "cleft $cleft, pleft $pleft, pmax $pmax, cmax $cmax"}; if ($.<=$pmax){ @c1= ($_,map{$x=<>;chomp $x;$x} 2..$cl); @c2=map{$x=<>;chomp $x;$x} 1..$cl; @c3=map{$x=<>;chomp $x;$x} 1..$cl; foreach my $idx (0..($cl-1)){ print join("|", $c1[$idx], $c2[$idx], $c3[$idx]) }; print (q{=} x (3*60).qq{\n}); print "line $., pmax $pmax"; } else { print }' long_text_60_chars_with_num_line.txt | less
Я поместил много отладочной информации, чтобы вы могли адаптировать ее к вашим потребностям.
Вот версия, удобная для человека (но копирование может не работать)
perl -lne 'BEGIN{$|=1; \
# max num lines (from wc -l) \
$max=1301; \
#lines per col \
$cl=50; \
# lines per pager \
$pl=$cl*3; \
# remainder lines for pager \
$pleft=$max % $pl; \
# remainder lines for col \
$cleft=$max % $cl; \
# max line for last full 3col page \
$pmax=$max - $pleft; \
# max line for last full column \
$cmax=$max - $cleft; \
# print info \
print "cleft $cleft, pleft $pleft, pmax $pmax, cmax $cmax"}; \
# END BEGIN \
# START -n while LOOP \
if ($.<=$pmax){ \
# full 3col pages \
@c1= ($_,map{$x=<>;chomp $x;$x} 2..$cl); \
@c2=map{$x=<>;chomp $x;$x} 1..$cl; \
@c3=map{$x=<>;chomp $x;$x} 1..$cl; \
foreach my $idx (0..($cl-1)){ \
print join("|", $c1[$idx], $c2[$idx], $c3[$idx]) \
}; \
print (q{=} x (3*60).qq{\n}); \
print "line $., pmax $pmax"; \
} else { \
# lazy approach: everyting else one column \
print \
}' \
long_text_60_chars_with_num_line.txt \
| less