বাইনারি ফাইলে বাইট সংঘটন পরিসংখ্যান কীভাবে সংগ্রহ করবেন?


12

আমি এর সমতুল্য জানতে চাই

cat inputfile | sed 's/\(.\)/\1\n/g' | sort | uniq -c

উপস্থাপন /programming/4174113/how-to-gather-characters-usage-statistics-in-text-file-using-unix-commands বাইনারি ফাইল কাউন্টিং জন্য পাঠ্য ফাইলের মধ্যে চরিত্র ব্যবহার পরিসংখ্যান উৎপাদনের জন্য অক্ষরের পরিবর্তে সাধারণ বাইটস, অর্থাৎ আউটপুট আকারে হওয়া উচিত

18383 57
12543 44
11555 127
 8393 0

কমান্ডটি অক্ষরের জন্য রেফারেন্সড হিসাবে যতক্ষণ সময় নেয় তা বিবেচনা করে না।

আমি যদি বাইনারি ফাইলগুলিতে অক্ষরগুলির জন্য কমান্ডটি প্রয়োগ করি তবে আউটপুটে অরক্ষিত অক্ষরের স্বতঃস্ফূর্ত দীর্ঘ সিকোয়েন্সের পরিসংখ্যান রয়েছে (আমি এর জন্য ব্যাখ্যা চাই না)।

উত্তর:


8

জিএনইউ সহ od:

od -vtu1 -An -w1 my.file | sort -n | uniq -c

বা আরও দক্ষতার সাথে perl(যেগুলি বাইট হয় না তার জন্য একটি গণনা (0) আউটপুট দেয়):

perl -ne 'BEGIN{$/ = \4096};
          $c[$_]++ for unpack("C*");
          END{for ($i=0;$i<256;$i++) {
              printf "%3d: %d\n", $i, $c[$i]}}' my.file

প্রথম সারিতে নম্বরগুলি সঠিকভাবে স্বীকৃতি পেতে পেতে আমাকে যথাক্রমে যোগ করতে হবে | sort -nএবং | sort -n -rঅবতীর্ণ ক্রমের জন্য (বাছাই করা প্রশ্নের অংশ ছিল না)। বাছাই আরও ভাল করা যেতে পারে ...
কার্ল রিখটার

পুরো ফাইলটি বাছাই করতে একটু ওভারকিল মনে হচ্ছে, তবে আমার জন্য ঠিক আছে।
মাইকেল অ্যান্ডারসন

গুড পয়েন্ট @ কার্ল, যদিও অনুরোধ করা হয়নি, sort -nএখানে ব্যবহার করা আরও অনেক বেশি অর্থবোধ করে । উত্তর আপডেট হয়েছে।
স্টাফেন চেজেলাস

4

বড় ফাইলগুলির জন্য বাছাই করার পদ্ধতি ধীর হবে। সমতুল্য সমস্যা সমাধানের জন্য আমি একটি সংক্ষিপ্ত সি প্রোগ্রাম লিখেছি ( পরীক্ষাগুলির সাথে মেকফিলের এই টুকরোটি দেখুন ):

#include <stdio.h>

#define BUFFERLEN 4096

int main(){
    // This program reads standard input and calculate frequencies of different
    // bytes and present the frequences for each byte value upon exit.
    //
    // Example:
    //
    //     $ echo "Hello world" | ./a.out
    //
    // Copyright (c) 2015 Björn Dahlgren
    // Open source: MIT License

    long long tot = 0; // long long guaranteed to be 64 bits i.e. 16 exabyte
    long long n[256]; // One byte == 8 bits => 256 unique bytes

    const int bufferlen = BUFFERLEN;
    char buffer[BUFFERLEN];
    int i;
    size_t nread;

    for (i=0; i<256; ++i)
        n[i] = 0;

    do {
        nread = fread(buffer, 1, bufferlen, stdin);
        for (i = 0; i < nread; ++i)
            ++n[(unsigned char)buffer[i]];
        tot += nread;
    } while (nread == bufferlen);
    // here you may want to inspect ferror of feof

    for (i=0; i<256; ++i){
        printf("%d ", i);
        printf("%f\n", n[i]/(float)tot);
    }
    return 0;
}

ব্যবহার:

gcc main.c
cat my.file | ./a.out

তোমার কি পরীক্ষা আছে? কোডটিতে কোনও মন্তব্য নেই। সাধারণভাবে অনির্ধারিত ব্যবহার করা এবং অরীক্ষিত বা নিরবিচ্ছিন্ন কোড প্রকাশ করা ভাল ধারণা নয় - এটি সাধারণ অনুশীলন কিনা তা বিবেচ্য নয়। এই প্ল্যাটফর্মটিতে পুনর্বিবেচনাগুলির পর্যালোচনা করার সম্ভাবনাও সীমাবদ্ধ, একটি স্পষ্ট কোড হোস্টিং প্ল্যাটফর্ম বিবেচনা করুন।
কার্ল রিখটার

@ কার্লরিখটার পরীক্ষা যুক্ত করা ভাল ধারণা ছিল। আমি পুরানো সংস্করণটি '\ 0' অক্ষরগুলিতে চেপে ধরেছি। এই সংস্করণটি কাজ করা উচিত (কমপক্ষে কয়েকটি বেসিক পরীক্ষায় পাস করে)।
বজোর্ন ডালগ্রেন

fgetsএকটি রেখা পায়, বাফার-পূর্ণ নয়। আপনি স্টিডিন থেকে পড়া প্রতিটি লাইনের জন্য 4096-বাইটের পূর্ণ বাফারটি স্ক্যান করছেন। তোমার freadএখানে দরকার , না fgets
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস দুর্দান্ত - ফ্রিড সম্পর্কে জানতেন না (সি থেকে খুব কমই আমি / ও করি)। পরিবর্তে ফ্রেড ব্যবহার করার জন্য আপডেট করা উদাহরণ।
বজোর্ন ডাহলগ্রেন

আমি প্রিন্টফif স্টেটমেন্টগুলির চারপাশে একটি ব্লক যুক্ত করেছি , যা ইনপুট ফাইলটিতে কিছু বাইট না ঘটে যদি আউটপুটটিকে আরও পঠনযোগ্য করে তোলে: gist.github.com/martinvonwittich/…
মার্টিন ভন

3

বাইনারি ফাইলগুলির সামগ্রীর পরিসংখ্যান সম্পর্কিত তথ্য বিচার করার সময় সিগমা এবং সিভি প্রায়শই গুরুত্বপূর্ণ, আমি একটি সেমিডলাইন প্রোগ্রাম তৈরি করেছি যা সিগমা থেকে বাইট বিচ্যুতিগুলির একটি এসকিআই সার্কেল হিসাবে এই সমস্ত ডেটা গ্রাফ করে।
http://wp.me/p2FmmK-96
এটি পরিসংখ্যান আহরণের জন্য গ্রেপ, এক্সার্গস এবং অন্যান্য সরঞ্জামগুলির সাথে ব্যবহার করা যেতে পারে। এখানে চিত্র বর্ণনা লিখুন


1

recodeপ্রোগ্রাম পারেন বাইট জন্য অথবা বিভিন্ন চরিত্র সেট অক্ষরের জন্য ফ্রিকোয়েন্সি পরিসংখ্যান পারেন এমনকি বড় ফাইল জন্য দ্রুত এই কাজ করতে পারেন। যেমন বাইট ফ্রিকোয়েন্সি গণনা:

$ echo hello there > /tmp/q
$ recode latin1/..count-characters < /tmp/q
1  000A LF   1  0020 SP   3  0065 e    2  0068 h    2  006C l    1  006F o
1  0072 r    1  0074 t

সাবধানতা - আপনার ফাইলটিকে স্ট্যান্ডার্ড ইনপুট হিসাবে পুনর্নির্মাণের জন্য নির্দিষ্ট করুন, অন্যথায় এটি নীরবে এটি অক্ষরের ফ্রিকোয়েন্সিগুলির সাথে প্রতিস্থাপন করবে!

ব্যবহার করুন recode utf-8/..count-characters < fileUTF-8 যেমন ইনপুট ফাইল চিকিত্সা। আরও অনেকগুলি চরিত্রের সেট পাওয়া যায় এবং যদি ফাইলটিতে কোনও অবৈধ অক্ষর থাকে তবে এটি ব্যর্থ হবে।


1

এটি স্টিফেনের odউত্তরের অনুরূপ তবে এটি বাইটের ASCII মান দেখায়। এটি ফ্রিকোয়েন্সি / সংঘটনগুলির সংখ্যা অনুসারে বাছাই করা হয়।

xxd -c1 my.file|cut -c10-|sort|uniq -c|sort -nr

অনেকগুলি প্রক্রিয়া শুরু হওয়ার পরে এটি কার্যকর বলে আমি মনে করি না তবে এটি একক ফাইল, বিশেষত ছোট ফাইলের পক্ষে ভাল small

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