প্রতিটি চরিত্রের উপস্থিতিগুলি কীভাবে গণনা করবেন?


14

উদাহরণস্বরূপ আমার কাছে ফাইল রয়েছে 1.txt, এতে রয়েছে:

Moscow
Astana
Tokyo
Ottawa

আমি সমস্ত চরের সংখ্যা এই হিসাবে গণনা করতে চাই:

a - 4,
b - 0,
c - 1,
...
z - 0

4
গৃহীত উত্তর থেকে, এটি সম্পূর্ণ পরিষ্কার নয়, আপনি কি "এ" এবং "একটি" বিশিষ্ট চান বা না চান? আপনার প্রশ্ন আপনাকে পরামর্শ দেয়।
জ্যাকব Vlijm

উত্তর:


21

আপনি এটি ব্যবহার করতে পারেন:

sed 's/./&\n/g' 1.txt | sort | uniq -ic
  4  
  5 a
  1 c
  1 k
  1 M
  1 n
  5 o
  2 s
  4 t
  2 w
  1 y

sedঅংশ প্রতিটি ভাষার প্রতিটি অক্ষরের পর একটি newline স্থাপন করা হয়। তারপরে আমরা sortবর্ণানুক্রমিকভাবে আউটপুট করি। এবং শেষ uniqপর্যন্ত উপস্থিতির সংখ্যা গণনা করে। আপনি যদি মামলা সংবেদনশীলতা না চান তবে এর -iপতাকাটি uniqবাদ দেওয়া যেতে পারে।


3
এটা অসাধারণ. অতিরিক্ত পরিমাণ সতর্কতা হ'ল আউটপুটটিকে আবার অক্ষরে অক্ষরে sort -k 2তালিকাভুক্ত করা হবে।
tetris11

3
এটি সংক্ষিপ্ততম উপায়, সবচেয়ে বোধগম্য হলেও দুর্ভাগ্যক্রমে সবচেয়ে ধীর
c0rp

ম্যাক অপারেটিং সিস্টেম একাদশ ব্যবহার ছিল উপর sed -e $'s/\(.\)/\\1\\\n/g'(এছাড়াও দেখুন stackoverflow.com/a/18410122/179014 )
asmaier

ঘটনার সংখ্যা (সাজানো) করে অর্ডার করতে: | sort -rnk 1। এবং যদি আপনি খুব বড় ফাইলগুলির সাথে লেনদেন করেন, যেমন আমি, আপনি প্রকৃত গণনাগুলির জন্য প্রক্সি পেতে কেবল কয়েক হাজার লাইনের নমুনা দিতে পারেন:cat 1.txt | shuf -n 10000 | sed 's/\(.\)/\1\n/g' | sort | uniq -ic | sort -rnk 1
সিপাহী

6

কিছুটা দেরি হয়ে গেলেও সেটটি শেষ করতে আরেকটি অজগর (3) এপ্রোচ, সাজানো ফলাফল:

#!/usr/bin/env python3
import sys

chars = open(sys.argv[1]).read().strip().replace("\n", "")
[print(c+" -", chars.count(c)) for c in sorted(set([c for c in chars]))]

A - 1
M - 1
O - 1
T - 1
a - 4
c - 1
k - 1
n - 1
o - 4
s - 2
t - 3
w - 2
y - 1

ব্যাখ্যা

  1. ফাইলটি পড়ুন, স্পেসগুলি এড়িয়ে যান এবং "অক্ষর" হিসাবে ফিরে আসে:

    chars = open(sys.argv[1]).read().strip().replace("\n", "")
  2. কৌশলগুলির (সাজানো) সেট তৈরি করুন:

    sorted(set([c for c in chars]))
  3. প্রতিটি চরিত্রের জন্য উপস্থিতি গণনা করুন এবং মুদ্রণ করুন:

    print(c+" -", chars.count(c)) for c in <uniques>

কিভাবে ব্যবহার করে

  1. একটি খালি ফাইলে কোডটি আটকান, এটি সংরক্ষণ করুন chars_count.py
  2. এটি একটি যুক্তি হিসাবে ফাইল দিয়ে চালান:

    /path/to/chars_count.py </path/to/file>

    যদি স্ক্রিপ্টটি কার্যকর হয়, বা:

    python3 /path/to/chars_count.py </path/to/file>

    যদি তা না হয়


5

ডিফল্টরূপে এফ ield এস eparator (ফাঃ) হল স্থান বা ট্যাব । যেহেতু আমরা প্রতিটি অক্ষর গণনা করতে চাই, তাই FS=""প্রতিটি অক্ষরকে পৃথক লাইনে বিভক্ত করতে এবং এটিকে একটি অ্যারেতে সংরক্ষণ করতে এবং END{..}ব্লকের অভ্যন্তরে শেষে , আমাদের মোট উপস্থিতি নিম্নলিখিত কমান্ড দ্বারা মুদ্রণ করতে হবে :

$ awk '{for (i=1;i<=NF;i++) a[$i]++} END{for (c in a) print c,a[c]}' FS="" file
A 1
M 1
O 1
T 1
a 4
c 1
k 1
n 1
o 4
s 2
t 3
w 2
y 1

ইন {for (i=1;i<=NF;i++) a[$i]++} ... FS="" ...ব্লক আমরা শুধু অক্ষর splits। আর
END{for (c in a) print c,a[c]}ব্লক আমরা অ্যারেতে লুপিং হয় aএবং এটি চরিত্র সংরক্ষিত প্রিন্টিং print cএবং ঘটনার সংখ্যারa[c]


3

forআপনি যে সমস্ত অক্ষর গণনা করতে চান তার জন্য একটি লুপ করুন এবং চরিত্রের সমস্ত উপস্থিতি grep -ioপেতে এবং কেস উপেক্ষা wc -lকরার জন্য এবং উদাহরণগুলি গণনা করতে, এবং ফলাফলটি মুদ্রণ করুন।

এটার মত:

#!/bin/bash

filename="1.txt"

for char in {a..z}
do
    echo "${char} - `grep -io "${char}" ${filename} | wc -l`,"
done

স্ক্রিপ্ট এটি আউটপুট:

a - 5,
b - 0,
c - 1,
d - 0,
e - 0,
f - 0,
g - 0,
h - 0,
i - 0,
j - 0,
k - 1,
l - 0,
m - 1,
n - 1,
o - 5,
p - 0,
q - 0,
r - 0,
s - 2,
t - 4,
u - 0,
v - 0,
w - 2,
x - 0,
y - 1,
z - 0,

মন্তব্য করার পরে সম্পাদনা করুন

সমস্ত মুদ্রণযোগ্য অক্ষরের জন্য একটি লুপ তৈরি করতে আপনি এটি করতে পারেন:

#!/bin/bash

filename="a.txt"

for num in {32..126}
do
   char=`printf "\x$(printf %x ${num})"`
   echo "${char} - `grep -Fo "${char}" ${filename} | wc -l`,"
done

এটি 32 থেকে 126 পর্যন্ত সমস্ত এএনএসআই অক্ষর গণনা করবে - এগুলি সর্বাধিক পঠনযোগ্য। মনে রাখবেন যে এটি উপেক্ষা করা ক্ষেত্রে ব্যবহার করে না।

এর থেকে আউটপুট হবে:

- 0,
! - 0,
" - 0,
# - 0,
$ - 0,
% - 0,
& - 0,
' - 0,
( - 0,
) - 0,
* - 0,
+ - 0,
, - 0,
- - 0,
. - 0,
/ - 0,
0 - 0,
1 - 0,
2 - 0,
3 - 0,
4 - 0,
5 - 0,
6 - 0,
7 - 0,
8 - 0,
9 - 0,
: - 0,
; - 0,
< - 0,
= - 0,
> - 0,
? - 0,
@ - 0,
A - 1,
B - 0,
C - 0,
D - 0,
E - 0,
F - 0,
G - 0,
H - 0,
I - 0,
J - 0,
K - 0,
L - 0,
M - 1,
N - 0,
O - 1,
P - 0,
Q - 0,
R - 0,
S - 0,
T - 1,
U - 0,
V - 0,
W - 0,
X - 0,
Y - 0,
Z - 0,
[ - 0,
\ - 0,
] - 0,
^ - 0,
_ - 0,
` - 0,
a - 4,
b - 0,
c - 1,
d - 0,
e - 0,
f - 0,
g - 0,
h - 0,
i - 0,
j - 0,
k - 1,
l - 0,
m - 0,
n - 1,
o - 4,
p - 0,
q - 0,
r - 0,
s - 2,
t - 3,
u - 0,
v - 0,
w - 2,
x - 0,
y - 1,
z - 0,
{ - 0,
| - 0,
} - 0,
~ - 0,

আপনি যদি মামলাটি উপেক্ষা করতে চান না তবে iগ্রেপ থেকে অপসারণ করুন । (আপনার প্রশ্নে আপনার প্রত্যাশিত ফলাফলের মাত্র 3 টি ছিল)
স্টেলিট

ধন্যবাদ. "{a..z}" - এটি কি 'এ' থেকে 'জেড' এর সমস্ত প্রতীক? সমস্ত মুদ্রণযোগ্য প্রতীক সম্পর্কে কী, আমরা কীভাবে সেগুলি সমস্ত তালিকাভুক্ত না করে সেগুলি নির্ধারণ করতে পারি
সেট-এক্সএক্স

সমস্ত পাঠযোগ্য অক্ষরের সন্ধান কীভাবে প্রসারিত করা যায় সে সম্পর্কে উদাহরণ সহ আমার উত্তর আপডেট হয়েছে
স্টেলিট

এটা একটা ব্যাপার অনেক কলগুলির grepসমগ্র ইনপুট বারবার।
200_সুচিকা

3

এখানে আরও একটি সমাধান (বিশৃঙ্খলভাবে) ...

awk '
        { for (indx=length($0); indx >= 1; --indx)
                ++chars[tolower(substr($0, indx, 1))]
        }
END     { for (c in chars) print c, chars[c]; }
' 1.txt | sort
  • এটি সূচীর মান হিসাবে প্রতিটি অক্ষর এবং অ্যারের মান হিসাবে গণনা সহ একটি মিশুক অ্যারে তৈরি করে।
  • শেষ ক্রিয়াটি অ্যারের মুদ্রণ করে।

কোন প্রয়োজন নেই cat file | awk '...': আপনি সরাসরি বলতে পারেন awk '...' file
ফেডোরকিউ

2

নিম্নলিখিত perlঅনেলাইনার গণনা করবেন। আমি রেজিটাকে তালিকার প্রসঙ্গে রেখেছি (ম্যাচের সংখ্যা পেতে) এবং এটি স্কেলারের প্রসঙ্গে রেখেছি:

$ perl -e '$a=join("",<>);for("a".."z"){$d=()=$a=~/$_/gi;print"$_ - $d,\n"}' 1.txt
a - 5,
b - 0,
c - 1,
d - 0,
e - 0,
f - 0,
g - 0,
h - 0,
i - 0,
j - 0,
k - 1,
l - 0,
m - 1,
n - 1,
o - 5,
p - 0,
q - 0,
r - 0,
s - 2,
t - 4,
u - 0,
v - 0,
w - 2,
x - 0,
y - 1,
z - 0,

পেছনের কমাটি থেকে মুক্তি পেতে একটি গুরুত্বপূর্ণ পুনর্লিখনের প্রয়োজন মনে হচ্ছে:perl -Mfeature=say -e '$a=join("",<>);say join(",\n", map { sprintf("%s - %d", $_, ($d=()=$a=~/$_/gi)); } ("a".."z"))'
200_সুচি

2

পাইথন ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে:

#!/usr/bin/env python2
import collections, string
with open('1.txt') as f:
    input_string = f.read().replace('\n', '').lower()
    count_dict = collections.Counter(input_string)
    for char in string.lowercase:
        print char + ' - ' + str(count_dict[char]) + ','

এখানে আমরা প্রতিটি চরিত্রের উপস্থিতিগুলির সংখ্যা গণনা করতে collectionsমডিউলটির Counterবর্গ ব্যবহার করেছি , তারপরে মুদ্রণের উদ্দেশ্যে আমরা stringভেরিয়েবলের দ্বারা সমস্ত ছোট হাতের অক্ষর পেতে মডিউলটি ব্যবহার করেছি string.lowercase

একটি ফাইল এটা আপনার চাওয়া যেকোনো নাম যেমন দান উপরে স্ক্রিপ্ট সংরক্ষণ করুন count.py। এখন যে ডিরেক্টরিটি ফাইলটি সংরক্ষিত হয়েছে সেখান থেকে আপনি কেবল python count.pyফাইল চালানোতে চালাতে পারেন , অন্য কোনও ডিরেক্টরি থেকে ফাইলটি চালানোর জন্য পরম পাথটি ব্যবহার করতে পারে অর্থাৎ এটি কার্যকর করতে python /absolute/path/to/count.py


আপনি কি দয়া করে আপনার সমাধানটি পরিষ্কার করতে পারেন? আমার অর্থ: ফাইলের ফাইলের নাম তৈরি করুন, এই কোডটি দিন, chmod + x ইত্যাদি ইত্যাদি
c0rp 13

@ c0rp: সম্পন্ন ....
হিমাইল

1

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

#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
#include <math.h>
#include <sysexits.h>


inline static double square(double x)
{
    return x * x;
}


int main()
{
    static const unsigned distribution_size = 1 << CHAR_BIT;

    int rv = EX_OK;
    uintmax_t *distribution = calloc(distribution_size, sizeof(*distribution));

    {
        int c;
        while ((c = getchar()) != EOF)
            distribution[c]++;

        if (ferror(stdin)) {
            perror("I/O error on standard input");
            rv = EX_IOERR;
        }
    }

    uintmax_t sum = 0;
    for (unsigned i = 0; i != distribution_size; i++)
        sum += distribution[i];
    double avg = (double) sum / distribution_size;

    double var_accum = 0.0;
    for (unsigned i = 0; i != distribution_size; i++)
    {
        const uintmax_t x = distribution[i];

        printf("'%c' (%02X): %20ju", isprint((int) i) ? i : ' ', i, x);
        if (x != 0) {
            var_accum += square((double) x - avg);
            printf(" (%+.2e %%)\n", ((double) x / avg - 1.0) * 100.0);
        } else {
            var_accum += square(avg);
            putchar('\n');
        }
    }

    double stdev = sqrt(var_accum / distribution_size);
    double varcoeff = stdev / avg;
    printf(
        "total: %ju\n"
        "average: %e\n"
        "standard deviation: %e\n"
        "variation coefficient: %e\n",
        sum, avg, stdev, varcoeff);

    free(distribution);
    return rv;
}

এর সাথে সংকলন করুন (ধরে নিলে উত্স কোডটি এখানে থাকে character-distribution.c):

cc -std=c99 -O2 -g0 -o character-distribution character-distribution.c

সাথে চালানো:

./character-distribution < 1.txt

আপনার কাছে সি সংকলক প্রস্তুত না থাকলে, জিসিসি ইনস্টল করুন:

sudo apt-get install gcc build-essential

0

কঠোর কোড সহ @ হেইমাইলের অনুরূপ সমাধান, যা পাইথন ২.7 এবং পাইথন 3 এ কাজ করে।

#!/usr/bin/python

import collections
import fileinput
import itertools
import string

count = collections.Counter(itertools.chain(*fileinput.input()))
print(',\n'.join('{} - {}'.format(c, count[c] + count[c.upper()])
                 for c in string.ascii_lowercase))

প্রথম বিবৃতি, count = collections.Counter(…)সমস্ত বাস্তব কাজ করে।

  • fileinput.input() ইনপুটটির প্রতিটি লাইন পড়ে, যা স্টিডিনের মাধ্যমে বা কমান্ড-লাইন আর্গুমেন্ট হিসাবে পাইপ করা যেতে পারে।
  • * এটি একবারে রেখার চেয়ে একবারে একটি চরিত্রকে বিবেচনা করে।
  • count = Counter(…)একক পাসে প্রতিটি চরিত্রের উপস্থিতিগুলি দক্ষতার সাথে গণনা করে এবং ফলটি countভেরিয়েবলের মধ্যে সঞ্চয় করে ।

দ্বিতীয় লাইনটি কেবল ফলাফলগুলি মুদ্রণ করে।

  • '{} - {}'.format(c, count[c] + count[c.upper()]) for c in string.ascii_lowercase প্রতিটি অক্ষর এবং তার গণনা একটি তালিকা তৈরি করে।
  • print(',\n'.join(…)) এটিকে পছন্দসই বিন্যাসে রাখে: প্রতি লাইনে এক, কমা দ্বারা পৃথক করা, তবে শেষ লাইনে কোনও কমা নেই।

0

জিএনইউ অবাক ৪.১

awk -iwalkarray '{for (;NF;NF--) b[$NF]++} END {walk_array(b)}' FS=
[A] = 1
[O] = 1
[w] = 2
[k] = 1
[y] = 1
[T] = 1
[n] = 1
[a] = 4
[o] = 4
[c] = 1
[s] = 2
[t] = 3
[M] = 1

আপনার যদি জিএনইউ অ্যাডকের পূর্ববর্তী সংস্করণ থাকে তবে আপনি ব্যবহার করতে পারেন for (c in b) print c, b[c]


0

রুবি ব্যবহার করে উত্তরটি এখানে দেওয়া হল। স্ট্রিংটি বিভিন্ন চরিত্রের ইউনিক তালিকায় পরিবর্তন করে এবং সেগুলির প্রতিটিতে গণনা পদ্ধতি ব্যবহার করে করা হয়।

#!/usr/bin/env ruby

String content = IO.read("1.txt")
content.split("").uniq.sort.each { |chr| puts( chr + ' - ' + content.count(chr).to_s) }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.