উদাহরণস্বরূপ আমার কাছে ফাইল রয়েছে 1.txt
, এতে রয়েছে:
Moscow
Astana
Tokyo
Ottawa
আমি সমস্ত চরের সংখ্যা এই হিসাবে গণনা করতে চাই:
a - 4,
b - 0,
c - 1,
...
z - 0
উদাহরণস্বরূপ আমার কাছে ফাইল রয়েছে 1.txt
, এতে রয়েছে:
Moscow
Astana
Tokyo
Ottawa
আমি সমস্ত চরের সংখ্যা এই হিসাবে গণনা করতে চাই:
a - 4,
b - 0,
c - 1,
...
z - 0
উত্তর:
আপনি এটি ব্যবহার করতে পারেন:
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
বাদ দেওয়া যেতে পারে।
sort -k 2
তালিকাভুক্ত করা হবে।
sed -e $'s/\(.\)/\\1\\\n/g'
(এছাড়াও দেখুন stackoverflow.com/a/18410122/179014 )
| sort -rnk 1
। এবং যদি আপনি খুব বড় ফাইলগুলির সাথে লেনদেন করেন, যেমন আমি, আপনি প্রকৃত গণনাগুলির জন্য প্রক্সি পেতে কেবল কয়েক হাজার লাইনের নমুনা দিতে পারেন:cat 1.txt | shuf -n 10000 | sed 's/\(.\)/\1\n/g' | sort | uniq -ic | sort -rnk 1
কিছুটা দেরি হয়ে গেলেও সেটটি শেষ করতে আরেকটি অজগর (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
ফাইলটি পড়ুন, স্পেসগুলি এড়িয়ে যান এবং "অক্ষর" হিসাবে ফিরে আসে:
chars = open(sys.argv[1]).read().strip().replace("\n", "")
কৌশলগুলির (সাজানো) সেট তৈরি করুন:
sorted(set([c for c in chars]))
প্রতিটি চরিত্রের জন্য উপস্থিতি গণনা করুন এবং মুদ্রণ করুন:
print(c+" -", chars.count(c)) for c in <uniques>
chars_count.py
এটি একটি যুক্তি হিসাবে ফাইল দিয়ে চালান:
/path/to/chars_count.py </path/to/file>
যদি স্ক্রিপ্টটি কার্যকর হয়, বা:
python3 /path/to/chars_count.py </path/to/file>
যদি তা না হয়
ডিফল্টরূপে awk এফ 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]
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 টি ছিল)
grep
সমগ্র ইনপুট বারবার।
এখানে আরও একটি সমাধান (বিশৃঙ্খলভাবে) ...
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
।
নিম্নলিখিত 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"))'
পাইথন ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে:
#!/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
।
কিছুক্ষণ আগে আমি এটি করার জন্য একটি সি প্রোগ্রাম লিখেছিলাম, কারণ বড় ফাইলগুলি দেখার জন্য এবং কিছু স্ট্যাটিকস তৈরি করার জন্য আমার এটির দরকার ছিল ।
#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
কঠোর কোড সহ @ হেইমাইলের অনুরূপ সমাধান, যা পাইথন ২.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(…))
এটিকে পছন্দসই বিন্যাসে রাখে: প্রতি লাইনে এক, কমা দ্বারা পৃথক করা, তবে শেষ লাইনে কোনও কমা নেই।জিএনইউ অবাক ৪.১
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]
।
রুবি ব্যবহার করে উত্তরটি এখানে দেওয়া হল। স্ট্রিংটি বিভিন্ন চরিত্রের ইউনিক তালিকায় পরিবর্তন করে এবং সেগুলির প্রতিটিতে গণনা পদ্ধতি ব্যবহার করে করা হয়।
#!/usr/bin/env ruby
String content = IO.read("1.txt")
content.split("").uniq.sort.each { |chr| puts( chr + ' - ' + content.count(chr).to_s) }