লিনাক্সে "wc -c" এবং "wc -m" কমান্ড


24

আমার কাছে একটি পাঠ্য ফাইল রয়েছে, এর লিখিত সামগ্রীটি হ'ল:

i k k

আমি যখন wc -mএই ফাইলটিতে অক্ষর সংখ্যা গণনা করি , ফলাফল 7 হয়

প্রশ্ন 1: তবে কেন আমি 7 পেয়েছি, আমি " 6 " পাওয়া উচিত বলে মনে করি না যে এটি " শেষ প্রান্তের " চরিত্রটিকে গণনা করে ?

প্রশ্ন 2: ঠিক কীভাবে wc -mকাজ করে?

প্রশ্ন 3: আমি যখন ব্যবহার করি wc -c(বাইট সংখ্যা গণনা করতে), আমার একই ফলাফল হয় wc -m, তাই দুটি ভিন্ন বিকল্প থাকার মানে কী ? তারা ঠিক একই কাজ করে, তাই না? যদি না হয় তবে পার্থক্য কী এবং কীভাবে wc -cকাজ করে?



1
আপনি যদি সিআরএলএফ লাইন শেষের সাথে উইন্ডোজ থেকে ফাইল করেন তবে আপনি 7ও পেতে পারেন
ক্রিস এইচ

উত্তর:


36

সেখানে আপনার অবশ্যই 6 টি অক্ষর থাকা উচিত। চালানোর চেষ্টা করুন

cat -A filename

আপনার ফাইলের মুদ্রণবিহীন অক্ষরগুলি দেখতে। আপনার অতিরিক্ত কিছু থাকতে হবে। আমি যদি আপনার মতো একটি ফাইল তৈরি করি তবে আমি দেখতে পাচ্ছি

i k k$

তুমি একটা জায়গা রেখেছ? এটি 7 করবে: i k k $অথবা এটির একটি নতুন লাইন রয়েছে:

i k k$
$

যা 7

তুমি যা বল

wc -m

অক্ষর গণনা করে এবং

wc -c

বাইট গণনা যদি আপনার সমস্ত অক্ষর ASCII অক্ষর সেট এর অংশ হয়, তবে প্রতি চরিত্রের জন্য কেবল 1 বাইট থাকবে তাই আপনি উভয় কমান্ড থেকে একই গণনা পাবেন।

নন ASCII অক্ষর সহ একটি ফাইল চেষ্টা করুন:

$ echo ك > testfile
$ wc -m testfile
2 testfile
$ wc -c testfile
3 testfile

আহা! অক্ষরের চেয়ে এখন আরও বেশি বাইট।


3
আমি " ক্যাট-এ " কমান্ডটি ব্যবহার করেছি এবং শেষ পর্যন্ত দেখতে পেলাম যে " শেষ প্রান্তের " অক্ষর ( $ ) এর আগে আমার একটি জায়গা আছে । এজন্য আমি 6 এর পরিবর্তে 7 পেয়েছি ধন্যবাদ, " ক্যাট-এ " অনেক সাহায্য করেছিল।
SWIIWII

2
@ এসডাব্লুআইআইআই হ্যাঁ আমি কেবল উত্তরটি দিয়ে এটিকে যুক্ত করেছি যেহেতু আমি ভেবেছিলাম সম্ভবত এটিই হবে :)
জান্না

1
নিউলাইন চরিত্রটিও গণনা করা হয়েছিল। এমনকি যদি এটি সাজানোর মতো নাও হয়, তবুও এটি একটি চরিত্র এবং ফাইলে ডেটা অংশ হিসাবে গণনা করে। বিড়াল -A ভাল ব্যবহার। একবার এছাড়াও hexdump বা xxd যাও ব্যবহার করতে পারে কি একই
Sergiy Kolodyazhnyy

@ সার্গ হ্যাঁ, এবং cat -Aএটিও প্রদর্শন করবে। আমি আমার উত্তরে যুক্ত করেছি, ধন্যবাদ :)
Zanna

@ এসডব্লিউআইআইআইআইটি `likethis`পাঠযোগ্যভাবে তৈরি করার জন্য কোডটি ব্যাকটিক্সে রেখেছিল , এটিকে সাহসী করে
তুলবেন

2
$ locale charmap
UTF-8

আমার বর্তমান পরিবেশে, অক্ষর সেটটি ইউটিএফ -8, অর্থাৎ অক্ষরগুলি প্রতিটি চরিত্রের জন্য 1 থেকে 4 বাইট সহ এনকোড থাকে (যদিও ইউটিএফ -8 অনুমোদিত অক্ষর কোডের 0x7fffffff পর্যন্ত পয়েন্ট দেয়, বেশিরভাগ সরঞ্জামগুলি ইউটিএফ- 6 বাইট পর্যন্ত 8 বাইট সিকোয়েন্স)।

সেই অক্ষর সেটটিতে, ইউনিকোড থেকে সমস্ত অক্ষর পাওয়া যায়, একটি aবাইট মান 65 হিসাবে কোডেড হয়, একটি 3 বাইট 228 185 149 এবং éউদাহরণস্বরূপ দুটি বাইট অনুক্রম 195 169 হিসাবে as

$ printf 乕 | wc -mc
  1       3
$ printf a | wc -mc
  1       1

এখন:

$ export fr_FR.iso885915@euro
$ locale charmap
ISO-8859-15

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

আইএসও -8859-15 একটি একক বাইট অক্ষর সেট যার অর্থ এটিতে কেবল 256 টি অক্ষর রয়েছে (আসলে এটির তুলনায় আসলে আরও কম) coveredাকা রয়েছে। সেই নির্দিষ্ট চরিত্র সেটটি পশ্চিম ইউরোপের ভাষার জন্য ব্যবহৃত হয় কারণ এটি এর বেশিরভাগ ভাষা (এবং ইউরো প্রতীক) coversেকে রাখে।

এটি aইউটিএফ -8 বা এএসসিআইআই-র মতো বাইট মান 65 এর éসাথে অক্ষরযুক্ত রয়েছে, এতে অক্ষরটিও রয়েছে (উদাহরণস্বরূপ ফরাসী বা স্প্যানিশ ভাষায় সাধারণত ব্যবহৃত হয়) তবে বাইট মান 233 সহ, এতে 乕 অক্ষর নেই।

যে পরিবেশে, wc -cএবং wc -mসর্বদা একই ফলাফল দেবে।

বেশিরভাগ আধুনিক ইউনিক্স-মতো সিস্টেমে উবুন্টুতে, ডিফল্টটি সাধারণত ইউটিএফ -8 হয় কারণ এটি একমাত্র সমর্থিত অক্ষর সেট (এবং এনকোডিং) যা পুরো ইউনিকোড পরিসীমা জুড়ে।

অন্যান্য বহু-বাইট চরিত্রের এনকোডিংগুলি বিদ্যমান, তবে উবুন্টুতে সেগুলি যথাযথভাবে সমর্থিত নয় এবং আপনাকে সেগুলির সাথে একটি লোকেল তৈরি করতে সক্ষম হতে হুপসের মধ্য দিয়ে যেতে হবে এবং যদি আপনি এটি করেন তবে আপনি দেখতে পাবেন যে অনেক কিছুই না যথাযথভাবে কাজ কর.

উবুন্টুতে কার্যকরভাবে, অক্ষর সেটগুলি হয় একক-বাইট, বা ইউটিএফ -8।

এখন, আরও কয়েকটি নোট:

ইউটিএফ -8 এ, সমস্ত বাইট সিকোয়েন্সগুলি বৈধ অক্ষর তৈরি করে না। উদাহরণস্বরূপ, সমস্ত ইউটিএফ -8 অক্ষর যা ASCII নয় তা বাইট দ্বারা গঠিত হয় যেগুলির মধ্যে 8 তম বিট সেট রয়েছে, তবে যেখানে কেবল প্রথমটিতে 7 তম বিট সেট রয়েছে।

আপনার যদি 8 তম বিট সেট সহ বাইটগুলির ক্রম থাকে, যার কোনওটিতে 7 তম বিট সেট নেই, তবে এটি কোনও অক্ষরে অনুবাদ করা যায় না। এবং যখন আপনি সমস্যা এবং অসঙ্গতিগুলি শুরু করছেন তখন সফ্টওয়্যারগুলির সাথে কী করা উচিত তা জানে না। এই ক্ষেত্রে:

$ printf '\200\200\200' | wc -mc
      0       3
$ printf '\200\200\200' | grep -q . || echo no
no

wcএবং grepসেখানে কোনও চরিত্র খুঁজে পাও না:

$ x=$'\200\200\200' bash -c 'echo "${#x}"'
3

bash ৩. এটি যখন কোনও চরিত্রের বাইটের ক্রম মানচিত্র করতে পারে না, তখন এটি প্রতিটি বাইটকে একটি চরিত্র হিসাবে বিবেচনা করে।

এটি এমনকি আরও অনেক কিছুর মত সেখানে ইউনিকোড মধ্যে codepoints যে অক্ষর হিসাবে অবৈধ হয় আরো জটিল হতে পারে, এবং কিছু যে হয় অ অক্ষর , এবং টুল উপর নির্ভর করে, তাদের UTF-8 এনকোডিং বা একটি অক্ষর হিসেবে গণ্য হতে পারে না।

আরেকটি বিষয় বিবেচনায় রাখা হ'ল চরিত্র এবং গ্রাফেমের পার্থক্য এবং কীভাবে সেগুলি রেন্ডার করা হয় is

$ printf 'e\u301\u20dd\n'
é⃝
$ printf 'e\u301\u20dd' | wc -mc
      3       6

সেখানে আমরা একটি গ্রাফেম হিসাবে রেন্ডার করা 6 বাইট হিসাবে 3 অক্ষর কোড করেছি, কারণ আমরা একসাথে 3 টি অক্ষর পেয়েছি (একটি বেস অক্ষর, একটি সংমিশ্রণ তীব্র উচ্চারণ এবং একটি সংমিশ্রণ ঘের)।

wcউবুন্টুতে পাওয়া জিএনইউ বাস্তবায়নের ইনপুটটিতে -Lআপনাকে প্রশস্ত রেখার প্রস্থের প্রস্থটি জানাতে একটি সুইচ রয়েছে :

$ printf 'e\u301\u20dd\n' | wc -L
1

আপনি আরও দেখতে পাবেন যে কিছু অক্ষর উপরের থেকে আমাদের অক্ষরের মতো প্রস্থের গণনায় 2 টি কোষ দখল করে :

$ echo 乕 | wc -L
2

উপসংহারে: ওয়াইল্ডার শব্দের মধ্যে বাইট, চরিত্র এবং গ্রাফেম অগত্যা এক নয়।


1

wc -cএবং এর মধ্যে পার্থক্যটি wc -mহ'ল মাল্টবাইট অক্ষর (যেমন, ইউটিএফ 8) সহ একটি লোকালে, প্রাক্তন গণনা বাইট, এবং পরবর্তীকালে অক্ষর গণনা করা হয়। নিম্নলিখিত ফাইলটি বিবেচনা করুন:

$ hexdump -C dummy.txt 
00000000  78 79 cf 80 0a                                    |xy...|

(যারা ইউটিএফ 8 কথা বলেন না তাদের জন্য এটি 'এক্স', 'ওয়াই' এবং 'π' অক্ষর, তারপরে একটি নতুন লাইন রয়েছে)। এটি পাঁচ বাইট দীর্ঘ:

$ wc -c dummy.txt 
5 dummy.txt

তবে কেবলমাত্র চারটি অক্ষর দীর্ঘ:

$ wc -m dummy.txt 
4 dummy.txt

অথবা, এমনকি ইউটিএফ -32 বিবেচনা করুন যেখানে প্রতিটি চরিত্রের 4 বাইট রয়েছে।
Jörg ডব্লু মিট্টাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.