পাইপ '|' দিয়ে লাইনগুলি বাছাই না করা বাছাই করুন এটি সঠিকভাবে


17

আমি কিছু সাধারণ পাইপ-বিস্মৃত ডেটা বাছাই করার চেষ্টা করছি। তবে, বাছাই আসলে বাছাই করা হয় না। এটি আমার শিরোনাম সারিটি নীচে সরিয়ে নিয়েছে, তবে 241 দিয়ে শুরু হওয়া আমার দুটি সারি 24 দিয়ে শুরু করে একটি সারি দ্বারা বিভক্ত হচ্ছে।

cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376

sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c

কলামের শিরোনামগুলি ফাইলের নীচে সরানো হচ্ছে, সুতরাং বাছাই করে এটি পরিষ্কারভাবে প্রক্রিয়া করছে। তবে, আসল মানগুলি যেমনটি আমি প্রত্যাশা করতাম তেমন সাজানো হয় না।

এই ক্ষেত্রে আমি এটির সাথে কাজ করেছিলাম

sort sort_fail.csv --field-separator='|' -k1,1

তবে, আমি মনে করি এটির প্রয়োজনীয় হওয়া উচিত নয়। বাছাই কেন বাছাই হয় না?


2
ব্যবহার LC_COLLATE=C sort। আপনি যা প্রত্যাশা করছেন তার উপর নির্ভর করে আপনার প্রয়োজনও হতে পারেLC_COLLATE=C sort -t'|' -n
ম্যাসভি

3
"CSV শৈলী" ডাটা সাজাতে আপনি ব্যবহার করতে পারেন csvsortথেকে csvkit, যা সঠিকভাবে উদ্ধৃত মান পরিচালনা করে।
বাকুরিউ

উত্তর:


32

sort স্থানীয় সচেতন, তাই আপনার LC_COLLATE সেটিং (যা LANG থেকে উত্তরাধিকারসূত্রে প্রাপ্ত) এর উপর নির্ভর করে আপনি বিভিন্ন ফলাফল পেতে পারেন:

$ LANG=C sort sort_fail.csv 
241|212|20810378
241|213|20810376
24|121|2810172
column_a|column_b|column_c

$ LANG=en_US sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c

এটি স্ক্রিপ্টগুলিতে সমস্যা সৃষ্টি করতে পারে, কারণ কলিংয়ের লোকেল কী সেট করা হয়েছে সে সম্পর্কে আপনি অবগত নন এবং তাই বিভিন্ন ফলাফল পেতে পারে।

স্ক্রিপ্টগুলির জন্য প্রয়োজনীয় সেটিংসটি বাধ্য করা অস্বাভাবিক নয়

যেমন

$ grep 'LC.*sort' /bin/precat
      LC_COLLATE=C sort -u | prezip-bin -z "$cmd: $2"

এখন কি আকর্ষণীয়, এখানে, হয় | চরিত্রটি অদ্ভুত দেখাচ্ছে।

তবে এটি কারণ, এনএসইউ-র জন্য ডিফল্ট নিয়ম, যা আইএসও থেকে প্রাপ্ত says

$ grep 007C /usr/share/i18n/locales/iso14651_t1_common
<U007C> IGNORE;IGNORE;IGNORE;<j> # 142 |

যার অর্থ |চরিত্রটিকে উপেক্ষা করা হয়েছে এবং সাজানোর ক্রমটি এমন হবে যেন চরিত্রটির অস্তিত্ব নেই ..

$ tr -d '|' < sort_fail.csv | LANG=C sort
24121220810378
241212810172
24121320810376
column_acolumn_bcolumn_c

এবং এটি "অপ্রত্যাশিত" বাছাইয়ের সাথে মেলে যা আপনি দেখছেন।

চারপাশের কাজগুলি হ'ল ব্যবহার করতে -n(সংখ্যাসূচক প্রকারে বল প্রয়োগ করা), অথবা ক্ষেত্র বিভাজক (যেমনটি আপনি করেছিলেন) ব্যবহার করতে বা Cলোকেল ব্যবহার করতে পারেন ।


আকর্ষনীয়। আমি স্থানীয়করণ সম্পর্কে আরও কিছু হিট দেখেছি, তবে বুঝতে পেরেছি যে 24 বনাম 241 এর আপেক্ষিক ক্রমকে প্রভাবিত করবে, এর মতো কিছু নয়।
ব্যবহারকারী 10777668

7
জিএনইউ সাজানোর ক্ষেত্রে অতিরিক্ত অতিরিক্ত কিছু হ'ল --debugবিকল্পটি, যা তুলনা করতে ব্যবহৃত কী (আন্ডারলাইন করা) নির্দেশ করে
জেফ শ্যাচলার

--debug দিয়ে চলমান কেবল পুরো লাইনকে আন্ডারলাইন করে - সাজানো পাইপের চরিত্র সহ অন্তর্ভুক্ত, এটি স্থানীয়করণের কারণে কোনও প্রভাব ফেলতে পারে না। এটি একটি ভাল বৈশিষ্ট্য কিন্তু এই ক্ষেত্রে আমাকে সাহায্য করেনি (আমি চেষ্টা করেছি :)
ব্যবহারকারী 10777668

ঠিক এই কারণেই আমি এটি উল্লেখ করেছি, @ user10777668 - এটি সূচিত sortকরে যে আমরা অক্ষরে অক্ষরে থামার পরিবর্তে পুরো লাইনটি ব্যবহার করছি।
জেফ শ্যাচলার

আমি এটি থামার আশা করছিলাম না। আমি এটি পাইপের চরিত্রটি স্বীকৃতি দেবে এবং এটিকে অন্তর্ভুক্ত করার প্রত্যাশা করছিলাম, সুতরাং 24 | 1 এবং 241 কে আলাদাভাবে চিকিত্সা করব। আমি নিশ্চিত না - ডিবেগ কীভাবে এটি বদলে যেত এবং বাস্তবে এটি আন্ডারলাইনরেখা যায় দেখে মনে হচ্ছে এটি আসল সমস্যা থেকে সক্রিয়ভাবে বিভ্রান্ত হয়ে গেছে যেখানে স্থানীয়করণের ফলে পাইপ চরিত্রটি প্রবেশের দিকে নিয়ে গেছে
ব্যবহারকারী 10777668

1

আমাকে কী বিরক্ত 24করে তা হ'ল দু'জনের মধ্যে জায়গা থেকে সরে যায় না 241। দ্বিতীয় ক্ষেত্রটি শুরু হয় ক দিয়ে 14দ্বিতীয় ক্ষেত্রের শীর্ষস্থানীয় দিয়ে বাছাইয়ের চেষ্টা করে , 24এটিকে সরানো হয়েছে, তাই আমার সন্দেহ হয় অন্যথায় না sortবললে কেবল এটিকে উপেক্ষা করবেন |। চেষ্টা করুন sort -n...


1

-n, --numeric - সাজান স্ট্রিংয়ের সংখ্যার মান অনুসারে তুলনা করুন

210
23

-N ব্যতীত, পাঠ্য অনুসারে 210 পাঠের আগে যেমন আমার চরিত্রটি অক্ষরে যায়।


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