LC_COLLATE এর সাথে সাজানোর ক্রম নির্দিষ্ট করুন যাতে ছোট হাতের বড় হাতের অক্ষরের আগে


16

ফাইলটি দেওয়া হয়েছে:

$ cat file
1
a
C
B
2
c
3
A
b

ডিফল্টরূপে sortকরবে:

$ sort file
1
2
3
a
A
b
B
c
C

এর সাথে LC_COLLATE=Cছোট হাতের অক্ষরের আগে বড় হাতের অক্ষরে বাছাই করা হবে:

$ LC_COLLATE=C sort file
1
2
3
A
B
C
a
b
c

কেস অর্ডারিংকে বিপরীত করার জন্য কী সাজানো সম্ভব, এটি হ'ল অঙ্কগুলি, ছোট হাতের অক্ষর?

উত্তর:


8

আমি কোনও লোকেল জানি না যা ডিফল্টরূপে ক্রম অনুসারে সাজান। সমাধানটি হ'ল কাস্টমাইজড বাছাই অর্ডার সহ একটি কাস্টম লোকেল তৈরি করা। যদি কেউ, চার বছর পরে, একটি কাস্টম ফ্যাশন অনুসারে বাছাই করতে চায়, তবে কৌশলটি এখানে।

লোকালগুলির সিংহভাগ তাদের নিজস্ব সাজানোর ক্রম নির্দিষ্ট করে না, বরং সংজ্ঞায়িত ক্রম ক্রমের অনুলিপি করে /usr/share/i18n/locales/iso14651_t1_commonযাতে আপনি এটি সম্পাদনা করতে চান। আসলটি সংশোধন করে প্রায় প্রতিটি লোকেলের জন্য সাজানোর ক্রম পরিবর্তনের পরিবর্তে iso14651_t1_commonআমি আপনাকে একটি অনুলিপি তৈরি করার পরামর্শ দিই। বাছাইয়ের অর্ডার কীভাবে কাজ করে এবং $HOMEরুট অ্যাক্সেস ছাড়াই আপনার ডিরেক্টরিতে একটি কাস্টম লোকেল কীভাবে তৈরি করা যায় সে সম্পর্কে বিশদ একইরকম প্রশ্নের এই উত্তরটিতে পাওয়া যায় ।

কীভাবে aএবং Aতাদের প্রবেশের উপর ভিত্তি করে অর্ডার করা হয়েছে তা একবার দেখুন iso14651_t1_common:

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

bএবং Bঅনুরূপ:

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

আমরা দেখতে পাচ্ছি যে প্রথম পাসে উভয়ই রয়েছে aএবং Aকোলাকিং প্রতীক রয়েছে <a>, উভয়ই রয়েছে bএবং Bকোলাকিং প্রতীক রয়েছে <b>। যেহেতু <a>প্রদর্শিত হয় আগে <b>iso14651_t1_common, aএবং Aসামনে বাঁধা bএবং B। দ্বিতীয় পাসটি সম্পর্কগুলিকে ভেঙে দেয় না কারণ সমস্ত চারটি অক্ষরই কোলাটিং প্রতীক রয়েছে <BAS>তবে তৃতীয় পাসের সময় সম্পর্কগুলি সমাধান হয়ে গেছে কারণ ছোট হাতের অক্ষরের জন্য কোলাটিং প্রতীকটি <MIN>3467 লাইনে প্রদর্শিত হবে, বড় হাতের অক্ষরের জন্য আবদ্ধ প্রতীক <CAP>(লাইন 3488) । সুতরাং সাজানোর ক্রম হিসাবে শেষ পর্যন্ত a, A, b, B

প্রথম এবং তৃতীয় সঙ্কীর্ণ প্রতীকগুলি অদলবদল করে প্রথমে অক্ষরগুলি কেস (নিম্ন এবং তারপরে) পরে, পরে অ্যাকসেন্ট ( <BAS>অ-উচ্চারণযুক্ত) দ্বারা বর্ণানুক্রমিক ক্রম অনুসারে বাছাই করা হত । যাইহোক , উভয়ই <MIN>এবং <CAP>সংখ্যার অঙ্কগুলির আগে উপস্থিত হন, সুতরাং এটি অক্ষরের পরে অঙ্কগুলি রাখার অযাচিত প্রভাব ফেলবে।

সমস্ত ছোট হাতের অক্ষর তৈরি করার আগে অঙ্কগুলি রাখার সবচেয়ে সহজ উপায় হ'ল সমস্ত বড় অক্ষর আসার আগে সমস্ত অক্ষরকে সমান করে সেট করে প্রথম তুলনা করার সময় সমস্ত অক্ষরকে টাই করতে বাধ্য করা হয় <a>। তারা বর্ণানুক্রমে ক্ষেত্রে বর্ণ অনুসারে বাছাই করে তা নিশ্চিত করার জন্য, সর্বশেষ কলটিং প্রতীকটি থেকে IGNOREবর্তমান প্রথম আবদ্ধ প্রতীক থেকে পরিবর্তন করুন । এই প্যাটার্ন অনুসরণ করে, aহয়ে উঠবে:

<U0061> <a>;<BAS>;<MIN>;<a> # 198 a

A হবে:

<U0041> <a>;<BAS>;<CAP>;<a> # 517 A

b হবে:

<U0062> <a>;<BAS>;<MIN>;<b> # 233 b

B হবে:

<U0042> <a>;<BAS>;<CAP>;<b> # 550 B

এবং বাকি অক্ষরের জন্য।

একবার আপনি একটি কাস্টমাইজড সংস্করণ তৈরি করার পরে iso14651_t1_common, আপনার কাস্টম লোকেলটি সংকলন করতে উপরে লিঙ্কিত উত্তরের নির্দেশাবলী অনুসরণ করুন ।


6

LC_COLLATE=Cছোট হাতের অক্ষরের আগে বড় হাতের বাছাই করার জন্য সেটিং সর্বদা পর্যাপ্ত নয়। আপনার সেট করার দরকার হতে পারে LC_ALL=C

এটি নন-আলফানিউমিক এবং এমনকি প্রিন্টযোগ্য অক্ষরগুলিকেও বিবেচনায় নেবে, তবে আপনি যদি না চান তবে বিকল্পগুলি আছে -dএবং -i(বর্ণিত man sort) এটি বন্ধ করে দেবে।

এটি সম্ভবত মাল্টিবাইট ইনপুট দিয়ে খারাপভাবে ব্যর্থ হবে যেমন ইউএসএফ -8 নন-এএসসিআইআই অক্ষর সহ।

বড় হাতের (ক্রমানুসারে) ছোট হাতের (ক্রম) পাওয়ার জন্য, আমি এটির সর্বোত্তম উপায়টি পুরোপুরি প্রোগ্রামিং ল্যাঙ্গুয়েজ ভাঙার সাথে জড়িত না the পরে।

tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'

2

আমি কোনও বিশেষজ্ঞ নই তবে আমি কখনও লোকাল দেখিনি যা এই জাতীয় সংঘাতের সংজ্ঞা দেয়। এএআইএআইএকি এই জোটটি কেবল সিতে যেখানে এটি ASCII মানগুলির উপর ভিত্তি করে । (সাধারণত আমি এটি একটি স্ক্রিপ্টের মাধ্যমে সমাধান করব would)

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

এছাড়াও ভুলে যাবেন না যে যদি কোনও ডায়াক্রিটিক্স বা বিশেষ অক্ষর থাকে তবে সি লোকেল তাদের সাথে তেমন আচরণ করবে না আপনি চান। উদাহরণস্বরূপ, এটি áকাছাকাছি aবা Łকাছাকাছি রাখবে না L। এই জাতীয় ক্ষেত্রে, ভাষার স্থানীয় লোকাল সম্ভবত একটি আরও ভাল সূচনার পয়েন্ট হতে পারে।


0

আমি বিশ্বাস করি যে উত্তরটি এলসি_সিএলএলটি পরিবর্তনের প্রয়োজন ছাড়াই রয়েছে (যার অর্থ ফাংশনটি ডিফল্ট আচরণ হিসাবে ছেড়ে দেওয়া):

বাছাই -f ফাইল

এটি লিনাক্সে কাজ করে; আপনি যদি ইউনিক্সে থাকেন এবং কোনও আলাদা সংস্করণ চালিত হন তবে দয়া করে কমান্ডের জন্য আপনার সহায়তা বিভাগটি দেখুন। -f কে অবহেলা করা হিসাবে সংজ্ঞায়িত করা হয়।

পরিবর্তে (এবং অদ্ভুতভাবে) দ্রুত স্থির করার জন্য এবং ভুল জায়গায় স্থানান্তরিত ব্যাকরণ, স্টিফেন রাউচের জন্য ধন্যবাদ।


-1
LC_COLLATE="en_US.UTF-8" sort file

এটি বড় হাতের অক্ষরের আগে ছোট হাতকে বাছাই করে না? আইডোন.ন.জিটিজি 4 জে
iiSeymour

হুম, আমার ক্ষেত্রে এটি আপনার উদাহরণ ব্যবহার করে।
আনজান্ট

4
@ ইউনাকনাট এটি ভুল। সেমিকোলন ব্যতীত কমান্ড পরিবেশটি নির্ধারণ করতে পারে sortতবে সেমিকোলনের সাথে ভেরিয়েবলটি শেলের সাথে স্থানীয় এবং এর আচরণকে প্রভাবিত করে না sort। সেমিকোলনটি যেমন চলক রফতানি করা যায় তেমন রাখা যেতে পারে তবে এটি অন্যান্য কমান্ডগুলিকেও প্রভাবিত করবে।
Anders Sj Sqvist
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.