"সাজান" কমান্ডটি ব্যবহার করে কলামের অগ্রাধিকার অনুসারে সিএসভি ফাইলটি বাছাই করুন


95

আমার কাছে একটি সিএসভি ফাইল রয়েছে এবং আমি এটি কলামের অগ্রাধিকার অনুসারে বাছাই করতে চাই "অর্ডার বাই" এর মতো। উদাহরণ স্বরূপ:

3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1

এই পরিস্থিতি যদি কোনও "নির্বাচন করুন" এর ফলাফল হয়, তবে "আদেশ দ্বারা" নিম্নরূপ: কলাম 2, কলাম 1, কলাম 3 দ্বারা আদেশ করুন - ফলাফলটি হবে:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1

আমি ইউনিক্সে "সাজান" কমান্ড ব্যবহার করে কীভাবে একই ফলাফল পেতে পারি তা জানতে চাই।


4
যাইহোক, এটি একটি এসএসভি ফাইল (সেমিকোলন পৃথকীকৃত মান): পি
জন

উত্তর:


157
sort --field-separator=';' --key=2,1,3

9
মানগুলি যদি সংখ্যাসূচক হয় তবে আপনি সম্ভবত সেই -nবিকল্পটি ব্যবহার করে বিবেচনা করতে চান যা "স্ট্রিংয়ের সংখ্যার মান অনুসারে তুলনা করবে" বা -gবিকল্পটি "সাধারণ সংখ্যার মান অনুসারে তুলনা করবে"। সংখ্যার মানগুলির একটি স্ট্রিং তুলনা সংখ্যার মতো অর্ডার পাবে 1,10,2,20। কমপক্ষে সেগুলি সেন্টোজে আমার ধরণের সংস্করণে উপলভ্য। আপনার ধরণের সংস্করণে সঠিক বিকল্পগুলি কী তা আপনার ম্যান পৃষ্ঠার সাথে যাচাই করা উচিত।
আদম পোরাড

4
আমি পেয়েছিsort: stray character in field spec: invalid field specification ‘2,1,3’
মার্টিন থোমা

4
তবে sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csvআমার পক্ষে কাজ করেছেন।
মার্টিন থোমা

6
@ মার্টিন থোমা এটি অনেক দিন হয়ে গেছে তবে আমি আপনার সমস্যার মধ্যে পড়েছিলাম এবং আমি এটি পেয়েছি sort --field-separator=';' --key={2,1,3}। এটি GNU coreutils 8.4এপ্রিল 2016 থেকে কাজ করেছে
mrbolichi

4
@ এমব্রোলিচী স্বরলিপিটি বাশের --key={2,1,3}ব্রেস সম্প্রসারণ ব্যবহার করেছে
Kvantour

29

মনে করুন 3;10;3আপনার unsorted.csvফাইলটিতে অন্য একটি সারি রয়েছে । তারপরে আমি অনুমান করি যে আপনি একটি সংখ্যার অনুসারে বাছাইকৃত ফলাফল আশা করছেন:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3

এবং বর্ণমালা অনুসারে বাছাই করা নয়:

2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1

এটি পেতে, আপনাকে ব্যবহার করতে হবে -n:

sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv

এটি 2,2ব্যবহার করা আবশ্যক উল্লেখযোগ্য । যদি কেবল 2ব্যবহৃত হয় তবে sortক্ষেত্র 2 এর শুরু থেকে শেষ পর্যন্ত স্ট্রিংটি নেয়। 2,2নিশ্চিত করে যে কেবল ক্ষেত্র 2ব্যবহৃত হয়েছে।


8
-K 2, এবং -k 2,2 এর মধ্যে পার্থক্য হিসাবে পয়েন্টারটি উল্লেখযোগ্য! ম্যান পৃষ্ঠাটি আমার প্রথম পড়াতে আমি এটি উপেক্ষা করেছি। ধন্যবাদ
usonianhorizon

আমি কয়েক অতিরিক্ত সারি, যোগ 3;10;3, 3:10:5, 3:10;2, 3;10;3সোর্স ফাইলে যাতে, এবং যখন ব্যবহার শুধু -k 2,2 কলাম 2 এবং 3. মানুষ পৃষ্ঠাটি জানাচ্ছে উপর সাজাতে মনে হচ্ছে "The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."। আমার ক্ষেত্রে আগের কী (মান = 10) সমান তুলনা করেছিল, তবে আমি -kএকাধিকবার নির্দিষ্ট করেছিলাম না । আমি নিশ্চিত নই যে এটি নির্ভরযোগ্য আচরণ, বা আমার সিস্টেমের (ম্যাক) সম্পর্কিত। শেষ পর্যন্ত এটি প্রাথমিকভাবে বাছাই করা যতক্ষণ না প্রাথমিক বাছাই সঠিক।
দাভোস

ওহ আমি দেখতে পাচ্ছি -sস্থিতিশীল বাছাইও রয়েছে যা সমান কীগুলি উপেক্ষা করে, যা মানুষের মতে দৃশ্যত দ্রুত।
দাভোস

24

উপরের চার্লির উত্তর আমার পক্ষে সাইগউইন (সারণি সংস্করণ ২.০, জিএনইউ টেক্সটিলস) এ কাজ করে নি, নিম্নলিখিতটি করেছেন:

sort -t"," -k2 -k1 -k1

4
সাইগউইনের এক ধরণের পুরানো সংস্করণ রয়েছে। বরাবরের মতো, ম্যান পেজটি আপনার বন্ধু।
চার্লি মার্টিন

4
আমি @ চর্লিমার্টিনের সাথে একমত, আপনার সিস্টেমে ম্যান পৃষ্ঠাটি পরীক্ষা করা উচিত। CentOS এ আমি ব্যবহার করেছিsort --field-separator=';' -k2 -k1 -k3 test.csv
অ্যাডাম পোরাড

-6

.. এবং যদি কেউ 'সাজান' সমাধানটি অনুসরণ করে তবে এখন প্রতি লাইনে একক অনন্য এন্ট্রির চেয়ে বেশি (যেমন অনন্য এন্ট্রিগুলির শীর্ষ এক্স সংখ্যা) চায়, একবার আপনি 'বাছাই' ব্যবহার করে ফাইলটি বাছাই করলে আপনি ব্যবহার করতে পারেন আমি এখানে একটি ছোট অ্যাপ তৈরি করেছি:

https://github.com/danielversen/MiscStuff/blob/master/scriptts/findTopUniques.java


4
তোমার জন্য ভালো! তবে আপনার ক্ষেত্রে, আপনি কেবল ব্যবহার করতে পারেন cat unsorted-file | sort | uniq | head -X- Xআপনি প্রথম সারির সংখ্যাটি কখন আউটপুট করতে চান।
স্লাভিক মেল্টসার

@ স্লাভিকাম মন্তব্যটির জন্য অনেক ধন্যবাদ! যাইহোক, আপনার পরামর্শটি আলাদা ফলাফল দেয় .. আপনার পরামর্শটি সম্পূর্ণ বাছাই করা ফাইলটিতে প্রথম এক্স লাইন পেয়েছে, যেখানে আমরা "কী" প্রতি প্রথম এক্স লাইন পেতে চেয়েছিলাম (অর্থাত্ যদি আপনার নামগুলির সাথে কোনও সিএসভি থাকে, তবে যদি আপনি সাজান তবে কলাম 2 "শেষ নাম" দ্বারা আপনার কমান্ডগুলি সম্ভবত সম্ভবত "অ্যালেন" এর শেষ নাম হিসাবে 3 টি লাইন পেয়েছিল যেখানে আমাদের "অ্যালেন", "ব্রিটেন", "চার্লস" ইত্যাদি) পাওয়া যাবে। ধন্যবাদ যদিও!
ড্যানিয়েল Iversen

6
আপনি ভুল. আমি মন্তব্য করার আগে যে কমান্ডটি লিখেছিলাম তা চেষ্টা করে দেখতে পরামর্শ দেব। দ্রষ্টব্য, uniqপাইপ ক্রমে একটি কমান্ড রয়েছে sortএবং এর মধ্যে head, যা শীর্ষ সারিগুলি নিষ্কাশনের ঠিক আগে সমস্ত সাজানো সারিতে একটি স্বতন্ত্রতা দেয়।
স্লাভিক মেল্টসার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.