Можно ли отображать текстовый файл в нескольких вертикальных областях?

у меня есть текстовый файл с большим количеством символов 60 длинных строк, где я делаю поиск с помощью команды"/", чтобы выделить хиты. Я хотел бы визуально проверить этот длинный файл с выделенным текстом, но на многопанельной компоновке вместо того, чтобы иметь только текст в первых 60 символах моего окна терминала. Например:

less file.txt
/CG <enter> #to find occurrences of token 'CG'

вместо 60-символьных строк вида

xxxxxxxxxx
xxxxCGxxxx
xxxxxxxxxx
xxxxxxCGxx
xxxCGxxxxx
[...]

Я хотел бы иметь что-то вроде этого (здесь 4 вертикальный panes):

xxxxxxCGxx|xxCGxxxxxx|xxCGxxxxxx|xxxxxxxxxx
xxxxxxxxxx|xxxxxxxxxx|xxxxxxxCGx|xxxxCGxxxx
xxxxCGxxxx|xxxxCGxxxx|xxxxxxxxxx|xxxxxxxxxx
xxxxxxxxxx|xxxxxxxxxx|xxxxxCGxxx|xxxCGxxCGx
xxCGxxxxxx|xxxxxxCGxx|xxxxxxxxxx|xxxxxxxxxx
[...]

таким образом, каждый раз, когда я нажимаю "Page Down", я прокручиваю вниз в 4 раза больше текста, чем с одной панелью.

5
задан slhck
источник

2 ответов

это просто с хаком. Это, как я сделал это, когда я нуждался в что-то подобное в прошлом (но делать это правильно, вы должны узнать общее количество строк в файле первая и остановки записи после строки конец строки, в противном случае вы должны нажать 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
1
отвечен Pablo Marin-Garcia 2011-08-16 14:44:23
источник

вырезать файл в размер экрана куски строк и paste он вместе с трубой разделитель:

#!/bin/bash

working=/tmp/split.$$
pastetmp=/tmp/pasted.$$
screen_height=25
panes=4

rm -rf "$working" "$pastetmp"

mkdir -p "$working"
cd "$working"
split -l "$screen_height" ""

four=()
for file in * ; do
     four=("${four[@]}" "$file")
     if [ ${#four[@]} = "$panes" ] ; then
          paste -d'|' "${four[@]}" >> "$pastetmp"
          four=()
     fi
done

[ ${#four[@]} -gt 0 ] && paste -d'|' "${four[@]}" >> "$pastetmp"

less "$pastetmp"

называй как:

./script file.txt

Примечание: не проверено, но вы получаете идею.

1
отвечен phogg 2011-08-16 11:18:28
источник

Другие вопросы bash less