क्या मैं कई ऊर्ध्वाधर पैन में एक पाठ फ़ाइल प्रदर्शित कर सकता हूं?


2

मुझे 60 अक्षरों की लंबी लाइनों के साथ एक टेक्स्ट फ़ाइल मिली है, जहां मैं हिट्स को हाइलाइट करने के लिए "/" कमांड के साथ एक खोज करता हूं। मैं हाइलाइट किए गए पाठ के साथ इस लंबी फ़ाइल का नेत्रहीन निरीक्षण करना चाहूंगा, लेकिन मेरी टर्मिनल विंडो के पहले 60 char में केवल पाठ होने के बजाय एक बहु-फलक लेआउट पर। उदाहरण के लिए:

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

इसके बजाय 60-चार लाइनें इस तरह हैं:

xxxxxxxxxx
xxxxCGxxxx
xxxxxxxxxx
xxxxxxCGxx
xxxCGxxxxx
[...]

मैं कुछ इस तरह से करना चाहूंगा (यहां 4 ऊर्ध्वाधर पैन):

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

इस तरह, हर बार जब मैंने "पेज डाउन" मारा, तो मैं एक फलक के मुकाबले 4 गुना अधिक पाठ नीचे स्क्रॉल करूंगा।

जवाबों:


1

यह एक हैक के साथ सरल है। जब मैंने अतीत में भी कुछ ऐसा ही किया था, तो मैंने ऐसा किया था (लेकिन इसे ठीक से करने के लिए आपको अपनी फ़ाइल की कुल पंक्तियों को पहले पता लगाना होगा और लाइनों के अंत के बाद लाइनों को पकड़ना बंद करना होगा अन्यथा आपको 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

फ़ाइल को लाइनों के स्क्रीन आकार के टुकड़ों में काटें और 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" "$1"

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

नोट: परीक्षण नहीं किया गया है, लेकिन आपको इसका विचार है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.