- জেনারাল-নিউমেরিক-সাজান এবং জিএনও সাজানোর ক্ষেত্রে - সাংখ্যিক-সাজানোর বিকল্পগুলির মধ্যে পার্থক্য কী


113

sortদুই ধরণের সংখ্যার সাজান সরবরাহ করে। এটি ম্যান পৃষ্ঠা থেকে:

   -g, --general-numeric-sort
          compare according to general numerical value

   -n, --numeric-sort
          compare according to string numerical value

পার্থক্য কি?


17
মনে রাখবেন যে, পূর্ণ ডকুমেন্টেশন sortনয় manপৃষ্ঠা কিন্তু infoপৃষ্ঠা ( info sort)।
a3nm

উত্তর:


85

সাধারণ সংখ্যাসমূহ অনুসারে সংখ্যাটিকে ফ্লোট হিসাবে তুলনা করে, এটি বৈজ্ঞানিক স্বরলিপি দেয় যেমন 1.234E10 তবে ধীর এবং গোলাকার ত্রুটির সাথে সাপেক্ষে (1.2345678 1.2345679 এর পরে আসতে পারে), সংখ্যাগত সাজানটি কেবল একটি নিয়মিত বর্ণানুক্রমিক সাজান যা 10 পরে 9 পরে আসে।

Http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html দেখুন

'-g' '- জেনারাল-নিউমেরিক-সাজান' '--sort = সাধারণ-সংখ্যাসূচক' প্রতিটি লাইনটির উপসর্গটিকে একটি ডাবল-স্পষ্টতা ভাসমান পয়েন্ট সংখ্যায় রূপান্তর করতে স্ট্যান্ডার্ড সি ফাংশন স্ট্র্টড ব্যবহার করে সংখ্যার অনুসারে বাছাই করুন। এটি ভাসমান পয়েন্ট সংখ্যাগুলি 1.0e-34 এবং 10e100 এর মতো বৈজ্ঞানিক স্বরলিপিতে নির্দিষ্ট করার অনুমতি দেয়। LC_NUMERIC লোকাল দশমিক-পয়েন্টের অক্ষর নির্ধারণ করে। ওভারফ্লো, আন্ডারফ্লো বা রূপান্তর ত্রুটির প্রতিবেদন করবেন না। নিম্নলিখিত সহযোগী ক্রম ব্যবহার করুন: লাইনগুলি সংখ্যার সাথে শুরু হয় না (সমস্ত সমান হিসাবে বিবেচিত)। সামঞ্জস্যপূর্ণ তবে মেশিন-নির্ভর ক্রমে NANs ("সংখ্যা নয়" আইইইইউ ভাসমান পয়েন্ট গণিতগুলিতে) মানগুলি। মাইনাস অনন্ত। আরোহী সংখ্যার ক্রমে সীমাবদ্ধ সংখ্যা (-0 এবং +0 সমান সহ)। প্লাস অনন্ত।

বিকল্প নেই তবেই এই বিকল্পটি ব্যবহার করুন; এটি --numeric - সাজানোর (-n) এর চেয়ে অনেক ধীর এবং ভাসমান পয়েন্টে রূপান্তর করার সময় এটি তথ্য হারাতে পারে।

'-n' '--numeric-sort' '--sort = numeric' সাংখ্যিকভাবে বাছাই করুন। সংখ্যাটি প্রতিটি লাইনে শুরু হয় এবং blanচ্ছিক ফাঁকা, একটি বিকল্প - একটি খালি নম্বর '0' হিসাবে গণ্য করা হয়। LC_NUMERIC লোকাল দশমিক-পয়েন্টের অক্ষর এবং কয়েক হাজার বিভাজক নির্দিষ্ট করে। ডিফল্টরূপে একটি ফাঁকা স্থান বা ট্যাব হয় তবে এলসি_সিটিওয়াইপি লোকেল এটি পরিবর্তন করতে পারে।

তুলনা সঠিক; কোন রাউন্ডিং ত্রুটি নেই।

অগ্রণী '+' বা তাত্পর্যপূর্ণ স্বীকৃতি স্বীকৃত নয়। এই জাতীয় স্ট্রিংগুলিকে সংখ্যার সাথে তুলনা করতে - - জেনারাল-নিউমেরিক-সাজান (-g) বিকল্পটি ব্যবহার করুন।


2
ধন্যবাদ। আশ্চর্যজনক যে লোকটি এবং তথ্য পৃষ্ঠাগুলিতে এটি নেই। আমি gnu.org/software/coreutils/manual/html_node/index.html সম্পর্কেও জানতাম না
ট্রেনটন

6
এই জিনিস আমার জন্য কাজ করে না। আমি R1 R2 R10 R15 এর মতো সামগ্রী সহ তৃতীয় কলামের সাথে একটি ফাইল বাছাই করছি। হয় -k3.2nবা ব্যবহার করে -k3.2g, এটি R10আগে বাছাই হয় R2। বাছাই করা শব্দভাণ্ডারের, সংখ্যাসূচক নয়। আমি আশা করি এটি ক্ষেত্রটি দ্বিতীয় চরিত্র থেকে পরবর্তী হিসাবে একটি সংখ্যা হিসাবে আচরণ করবে।
কাজ

6
@ কাজ: sortএর মূল চশমা। সত্যিকার অর্থে বাইজেন্টাইন - এর সংক্ষিপ্তটি হ'ল: ক্ষেত্রের পূর্ববর্তী ফাঁকা গুলি গুলি ক্ষেত্রের অংশ হিসাবে বিবেচিত হয় , তাই চর। ক্ষেত্রের আসল প্রথম চরটি নয়, ক্ষেত্রের আগের ফাঁকা (প্রথম) দিকে 1 পয়েন্ট সূচক। চরটি প্রত্যয় bএই সমস্যাটি সমাধানের জন্য সূচক , যেমন: -k 3.2bn,3(নোট করুন যে বৈশ্বিক -b বিকল্পটি এই ক্ষেত্রে কার্যকর হয় না )। যোগ ,3করাটিও নোট করুন , এটি নিশ্চিত করে যে কেবল তৃতীয় ক্ষেত্র ব্যবহৃত হয় - ২ য় ক্ষেত্রের সূচক ব্যতীত, পুরো লাইনের অবশিষ্ট অংশটি ব্যবহৃত হয়।
mklement0

11

আপনার লোকেলের সাথে আপনার সাবধান হওয়া উচিত। উদাহরণস্বরূপ, আপনি একটি ভাসমান সংখ্যা বাছাই করার পরিকল্পনা করতে পারেন (২.২ এর মতো) যেখানে আপনার লোকালটি কমা ব্যবহারের আশা করতে পারে (২,২ এর মতো)।

এই ফোরামে রিপোর্ট হিসাবে , আপনার -n বা -g পতাকা ব্যবহার করে ভুল ফলাফল থাকতে পারে।

আমার ক্ষেত্রে আমি ব্যবহার:

LC_ALL=C sort -k 6,6n file

যাতে রয়েছে 6th ষ্ঠ কলামটি সাজানোর জন্য:

2.5
3.7
1.4

প্রাপ্ত করার জন্য

1.4
2.5
3.7

2
এমনকি ল্যাং = সি থাকা সত্ত্বেও আমি -nহাজার হাজার বিভাজক হিসাবে কমাটি চিনতে পারি না - "১,০০০" কে "1" হিসাবে একই বলে ধরা হয়।
স্কট

1
এটি LC_ALL = C হওয়া উচিত।
স্টুয়ার্ট পি। বেন্টলে

@ স্কট: প্রকৃতপক্ষে, হাজার হাজার পৃথককারী স্বীকৃত নয়: দীর্ঘতম উপসর্গ যুক্তি sortব্যবহার করে : একটি সংখ্যা হিসাবে ব্যবহৃত হিসাবে এটি স্বীকৃত রেখার / কীটির দীর্ঘতম অংশ; একটি লোকালে যা মূলত চরিত্র হিসাবে ব্যবহার করে, এটি পড়া বন্ধ করবে । .,
mklement0

@ স্টুয়ার্টপি.বেন্টলি: LC_ALL=Cপ্রকৃতপক্ষে সবচেয়ে শক্তিশালী পছন্দ; তবে, যদি LC_ALLবাজি সেট না হয়, LANG=Cখুব কার্যকর হবে।
mklement0

1
ভাল পয়েন্ট, তবে LANG=C sort -k 6,6n fileউভয়ই সহজ এবং নির্দিষ্ট কমান্ডের সাথে পরিবেশ পরিবর্তনশীল নির্ধারণের প্রভাবকে স্থানীয়করণ করে LANG
mklement0

0

-gবৈজ্ঞানিক স্বরলিপি অনুমোদনের ক্ষেত্রে উল্লেখযোগ্য স্বীকৃত উত্তরের পাশাপাশি , আমি সেই অংশটি দেখাতে চাই যা সম্ভবত অনাকাঙ্ক্ষিত আচরণের কারণ হয়।

সহ -g:

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -g myfile
baa
--inf
--inf  
--inf- 
--inf--
--inf-a
--nnf
nnf--
   nnn  
tnan
zoo
   naN
Nana
nani lol
-inf
-inf--
-11
-2
-1
1
+1
2
+2
0xa
11
+11
inf

তাকান zoo, তিনটি গুরুত্বপূর্ণ এখানে জিনিস:

  • লাইনটি NAN(উদাহরণস্বরূপ ) Nanaএবং (একক ড্যাশ, নয় ) শেষ হতে শুরু করে তবে অঙ্কগুলির আগে শুরু হয়। যদিও শেষ পদক্ষেপ সংখ্যার পর কারণ এটা অনন্ত মানেnani lol-INF--INFINF

  • NAN, INF, এবং -INFহয় যদি অবশ

  • লাইন সবসময় উভয় দিকে থেকে হোয়াইটস্পেস উপেক্ষা NAN, INF, -INF (নির্বিশেষে LC_CTYPE)। অন্যান্য বর্ণমালা উভয় দিক থেকে সাদা স্থান উপেক্ষা করতে পারে লোকেলের উপর নির্ভর করে LC_COLLATE(যেমন LC_COLLATE=fr_FR.UTF-8উপেক্ষা করুন তবে LC_COLLATE=us_EN.UTF-8উপেক্ষা করবেন না)।

সুতরাং আপনি যদি স্বেচ্ছাসেবী বর্ণমালা বাছাই করছেন তবে সম্ভবত আপনি চান না -g। আপনার যদি সত্যিকারের সাথে বৈজ্ঞানিক স্বরলিপি তুলনা প্রয়োজন -g, তবে আপনি সম্ভবত বর্ণমালা এবং সংখ্যাসূচক তথ্য বের করতে এবং আলাদাভাবে তুলনা করতে চান

আপনার যদি কেবলমাত্র সাধারণ সংখ্যা 1, -1বাছাই করতে হয় এবং 0x/E/+ sortingএটি গুরুত্বপূর্ণ মনে হয় না তবে কেবল -nপর্যাপ্ত পরিমাণে ব্যবহার করুন :

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-1000
-22
-13
-11
-010
-10
-5
-2
-1
-0.2
-0.12
-0.11
-0.1
0x1
0x11
0xb
+1
+11
+2
-a
-aa
--aa
-aaa
-b
baa
BAA
bbb
+ignore
inf
-inf
--inf
--inf  
--inf- 
--inf--
-inf--
--inf-a
   naN
Nana
nani lol
--nnf
nnf--
   nnn  
None         
uum
Zero cool
-zzz
1
1.1
1.234E10
5
11

হয় -gবা -n, স্থানীয় প্রভাব সম্পর্কে সচেতন হন । আপনি ভাসমান নম্বর সহ fr_FR.UTF-8 বাছাই এড়াতেLC_NUMERIC হিসাবে নির্দিষ্ট করতে চাইতে পারেন :us_EN.UTF-8 -

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=fr_FR.UTF-8 sort -n myfile
-10
-5
-2
-1
-1.1
-1.2
-0.1
-0.11
-0.12
-0.2
-a
+b
middle
-wwe
+zoo
1
1.1

সহ LC_NUMERIC=en_US.UTF-8:

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-10
-5
-2
-1.2
-1.1
-1
-0.2
-0.12
-0.11
-0.1
-a
+b
middle
-wwe
+zoo
1
1.1

বা এর LC_NUMERIC=us_EN.UTF-8সাথে গ্রুপ +|-|spaceকরতে alpha:

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=us_EN.UTF-8 sort -n myfile
-0.1
    a
    b
 a
 b
+b
+zoo
-a
-wwe
middle
1

আপনি সম্ভবত নির্দিষ্ট করতে চান localeযখন ব্যবহার sortযদি চান পোর্টেবল স্ক্রিপ্ট লিখতে।

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