অফসেট থেকে লাইন নম্বর পান


12

একটি ফাইলের জন্য বাইট অফসেট থাকা।

এমন কোনও সরঞ্জাম আছে যা এই বাইটের জন্য লাইন নম্বর দেয়?

  • শূন্য দিয়ে শুরু হওয়া বাইট গণনা, যেমন: প্রথম বাইট 0 নয় 1।
  • লাইন নম্বরটি 1 দিয়ে শুরু হচ্ছে।
  • ফাইলের উভয় প্লেইন পাঠ্য থাকতে পারে, "বাইনারি" ব্লবস, মাল্টিবাইট অক্ষর ইত্যাদি But

উদাহরণ, ফাইল:

001
002
003  <<-- first zero on this line is byte 8
004

বাইট অফসেট হচ্ছে 8যা আমাকে লাইন দেবে 3

অনুমান করুন আমি লাইন নম্বর খুঁজতে এই জাতীয় কিছু ব্যবহার করতে পারলাম:

 ক। tail -c+(offset + 1) file | wc -l, এখানে 1 থেকে গণনা +1হিসাবে  খ।  গ। তারপর যেখানে হয়tail
wc -l file
tail -n+numnuma - b + 1

তবে ... এমন কি এমন একটি, মোটামুটি সাধারণ, সরঞ্জাম যা আমাকে numসরাসরি দিতে পারে ?


সম্পাদনা, ত্রুটি: বা আরও স্পষ্ট:

head -c+offset file | wc -l

2
বাইনারি ফাইলগুলির লাইন নেই।
কুসালানন্দ

@ কুসালানন্দ: এই প্রসঙ্গে লাইনগুলি 0x0aবাইট দ্বারা পৃথক করা ডেটা ।
user367890

3
সম্ভবত আপনি যা জিজ্ঞাসা করছেন তা নয়, তবে ভিমের এটির জন্য একটি কার্য রয়েছে। এটি 1 থেকে অফসেট সংখ্যা, তাই: :echo byte2line(offset+1)
স্যাটাস কাতসুর

@ স্যাটোক্যাটসুরা: হ্যাঁ, এবং ধন্যবাদ। প্রথমে ভিমের সাথে চেষ্টা করলাম। কিন্তু এমনকি vim -bএবং vim+ + set binary+ + খোলা ফাইল এটি বিকৃত করা হয়েছে। (আহ। হঠাৎ আমি মনে করি কোন প্লাগইনটি এটিকে মিস করে)। তবে, যাইহোক, আমি এটি ব্যাচগুলিতে এবং বিভিন্ন স্ক্রিপ্টের সংমিশ্রণে ভিমকে প্রথমে ত্যাগ করা হয়েছিল। তবে যাইহোক +1।
user367890

@ user367890 একটি বাইনারি ফাইলের 0xaযে কোনও জায়গা থাকতে পারে । বাইনারি ফাইলে লাইনের ধারণাটি অর্থহীন।
ব্যবহারকারী 207421

উত্তর:


14

আপনার উদাহরণে,

001
002
003
004

8 নম্বর বাইটটি দ্বিতীয় লাইনের 0পরের লাইনে নয়।

নিম্নলিখিতটি আপনাকে $bবাইটগুলির পরে পূর্ণ লাইনের সংখ্যা দেবে :

$ dd if=data.in bs=1 count="$b" | wc -l

এটা তোলে রিপোর্ট হবে 2সঙ্গে b8 সেট এবং এটি রিপোর্ট হবে 1সঙ্গে b7 সেট।

ddউপযোগ পথে তা এখানে ব্যবহৃত হচ্ছে, ফাইল থেকে পড়তে হবে data.in, এবং পড়তে হবে $bআকার 1 বাইট ব্লক।

"আইক্রাস" নীচের মন্তব্যে যথাযথভাবে উল্লেখ করে, ব্যবহার bs=1করা অযোগ্য। এটি আরও কার্যকর, এই বিশেষ ক্ষেত্রে, অদলবদল করা bsএবং count:

$ dd if=data.in bs="$b" count=1 | wc -l

এটি প্রথম ddকমান্ডের মতো একই প্রভাব ফেলবে , তবে কেবলমাত্র একটি ব্লক $bবাইট পড়বে ।

wcউপযোগ গন্য নতুন লাইন, এবং একটি "লাইন" ইউনিক্স সবসময় একটি newline দ্বারা শেষ করা হয়। সুতরাং উপরের কমান্ডটি এখনও বলবে 2যদি আপনি b12 (নীচের নিউলাইন) এর চেয়ে কম কিছু সেট করে থাকেন। আপনি যে ফলাফলটির সন্ধান করছেন তা হ'ল উপরের পাইপলাইন রিপোর্টগুলি যতগুলিই হোক প্লাস 1।

এটি অবশ্যই আপনার ফাইলের বাইনারি ব্লব অংশে র্যান্ডম নিউলাইনগুলি গণনা করবে যা ASCII পাঠ্যের পূর্বে রয়েছে। যদি জেনেই যেখানে হওয়া ASCII বিট শুরু, আপনি যোগ করতে পারিনি skip="$offset"করার ddকমান্ড, যেখানে $offsetবাইটের সংখ্যা ফাইলে লাফালাফি হয়।


@ ডন_ক্রিসটিhead: unknown option -- c
কুসালানন্দ

@Kusalananda আপনি বাসদ মাথা ব্যবহার করছেন, অপশন সেখানে ভিন্ন
Sergiy Kolodyazhnyy

@ সার্জ :-) আমি এটি সম্পর্কে ভাল জানি। ওপি কী ব্যবহার করে তা আমরা জানি না, তাই আমি পসিক্সের সাথে লেগে আছি।
কুসালানন্দ

1
যেমন আমি প্রশ্নে উল্লেখ করেছি: বাইট গণনাটি 0 দিয়ে শুরু হয়, 1 নয়, তাই 8 == 0 ...
ব্যবহারকার 367890

@ user367890 সেক্ষেত্রে ব্যবহার করুন $(( b - 1 ))
কুসালানন্দ

4

বর্তমানে এর মতো কোনও উত্সর্গীকৃত সরঞ্জাম নেই, যদিও এটি অজগরটিতে মোটামুটি সহজেই করা যায়:

#!/usr/bin/env python3
import sys
import os

offset = int(sys.argv[2])
newline = 1
with open(sys.argv[1]) as fd:
    fd.seek(offset)
    while True:
        try:
            byte = fd.read(1)
            if byte == '\n': newline+=1
            #print(byte)
            offset = offset - 1
            fd.seek(offset)
        except ValueError:
            break
print(newline)

ব্যবহার সহজ:

line4byte.py <FILE> <BYTE>

পরীক্ষা রান:

$ cat input.txt
001
002
003
004
$ chmod +x ./line4byte.py                                                     
$ ./line4byte.py input.txt 8                                                  
3

এটি একটি খুব দ্রুত এবং সাধারণ স্ক্রিপ্ট। ফাইলটি খালি আছে কিনা তা এটি যাচাই করে না, সুতরাং এটি কেবল খালি নয় এমন ফাইলগুলিতে কাজ করে।


4

প্রদত্ত অফসেটটি যোগফলের মধ্যে থাকা উচিত বজায় থাকা বাইটগুলি সন্ধান করুন এবং বর্তমান লাইন নম্বর নির্গত করুন:

perl -E '$off=shift;while(<>){$sum+=length;if($sum>=$off){say $.;exit}}' 8 file

বা দৈর্ঘ্যে:

#!/usr/bin/env perl
use strict;
use warnings;
die "Usage: $0 offset file|-\n" if @ARGV != 2;
my $offset = shift;
shift if $ARGV[0] eq '-';
my $sum;
while (readline) {
    $sum += length;
    if ($sum >= $offset) {
        print "$.\n";
        exit;
    }
}
exit 1;

3
$perl -0nE 'say substr($_,0,8)=~ y/\n//'  ex
2
  • perl -0nE expইনপুটটি স্লর্প $_করে এক্সপ এক্সিকিউট করে
  • substr(string,0,8) প্রথম 8 বাইট নির্বাচন করে
  • y/\n//অপসারণ করে \nএবং তার নম্বর প্রদান করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.