কিভাবে ইউনিক্স বাছাই করে কাস্টম বাছাই করবেন?


11

আমি একাধিক কলাম সহ কমা বিস্মৃত ফাইল বাছাই করতে ইউনিক্স বাছাই ব্যবহার করছি। এখনও অবধি, এটি সংখ্যা বা বর্ণমালা অনুসারে তথ্য বাছাইয়ের জন্য নিখুঁতভাবে কাজ করেছে:

যেকোন ধরণের বাছাইয়ের আগে ফাইলের উদাহরণ:

C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1

ফাইলটি বাছাই করুন: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv

সাজানো ফলাফল:

A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1

এখানে সমস্যাটি রয়েছে: আমি কাস্টম বাছুর উপর ভিত্তি করে কলাম 2 বাছাই করতে চাই, যার অর্থ আমি প্রথমে মার্কিন যুক্তরাষ্ট্র, তারপরে কানাডা এবং তার পরে বাহামাস চাই:

পছন্দসই বাছাই:

A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2

ইউনিক্স বাছাই করার কোনও উপায় কি কোনও কাস্টম সাজানোর অর্ডারের পরে প্রয়োগ করা যেতে পারে? কিছুটা এইরকম: $ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv

ধন্যবাদ!


3
এই তিনটি মানের জন্য, আপনি বিপরীত বর্ণানুক্রমিক ক্রম চান। সাধারণ ক্ষেত্রে, আপনাকে নামগুলি একটি বাছাই করা অর্ডার নম্বরটিতে ম্যাপ করতে হবে এবং তারপরে বাছাই করা অর্ডার নম্বর ব্যবহার করে বাছাই করতে হবে। বা কোনও স্ক্রিপ্টিং ভাষার জন্য যান ... একটি সম্ভাবনা হ'ল joinআদেশ, তবে আপনি অনেকগুলি বাছাই করে শেষ করতে পারেন - এর জন্য ইনপুট ফাইলগুলি joinঅবশ্যই এক ক্রম অনুসারে বাছাই করা উচিত এবং তারপরে আপনি sortআবার ডেটা put োকাতে চাইছেন একটি আলাদা অর্ডার (এবং পোস্ট-বাছাই পদক্ষেপ হিসাবে ক্রম ক্রম কলামটি হারাতে)
জোনাথন লেফলার

আপনার উদাহরণ ইনপুটটিতে, শেষ লাইনের tপরিবর্তে থাকা উচিত নয় f?
লেভ লেভিটস্কি

লেভ: হ্যাঁ, ভাল ক্যাচ আমার খারাপ; অত্যধিক কাটিয়া এবং আটকানো (আমার আসল ডেটা সেটটি অনেক বড় এবং আমি ঘটনাক্রমে ভুল সারিগুলি ধরলাম)।

আমি আপনার ডেটা মেলে উত্তর আপডেট করেছি।
লেভ লেভিটস্কি

উত্তর:


8

অন্যান্য উত্তর এবং মন্তব্য সাধারণভাবে প্রশ্নের উত্তর দেয়, এখানে বাস্তবায়ন কীভাবে দেখা যায় তা এখানে:

$ cat order
Bahamas,3
Canada,2
United States,1

$ cat data
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1

$ sort -t, -k2 data | join -t, -11 -22 order - | sort -t, -k2n -k4,5 -k6r -k7nr | cut -d, -f 3,1,4-7
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2

দুর্দান্ত, আপনার সহায়তার জন্য ধন্যবাদ এটি নিখুঁতভাবে কাজ করেছে!

@ জেভিলিয়া আরও একবার উন্নত sedহয়েছে, এখানে সত্যিই প্রয়োজন ছিল না।
লেভ লেভিটস্কি 21

1

আপনি বাছাই করে এটি করতে পারবেন না । এই মুহুর্তে, আপনার সত্যিকার অর্থে awk / perl / আপনার ভাষা-পছন্দ পছন্দ করা উচিত । যদিও আপনি এটি fudge করতে পারেন। উদাহরণস্বরূপ, আপনি "মার্কিন যুক্তরাষ্ট্র" থেকে 0, "কানাডা" কে 1 এবং "বাহামা" থেকে 2 তে পরিবর্তন করতে সেড ব্যবহার করতে পারেন, তারপরে সেই কলামটির বিপরীতে একটি সাংখ্যিক বাছাই করতে পারেন এবং তারপরে সেড করতে পারেন। বা "যুক্তরাষ্ট্রে" "মার্কিন যুক্তরাষ্ট্র, ০" ইত্যাদি পরিবর্তন করুন, অতিরিক্ত কলামের তুলনায় বাছাই করুন এবং তারপরে এটি বাতিল করুন।


0

এটি করা সহজ করার জন্য আমি সিসোর্ট নামে একটি সহায়ক লিখেছি । এটি আপনার লাইনের সাথে সাবস্ট্রিংয়ের উপর ভিত্তি করে বা নিয়মিত অভিব্যক্তির মিলের ভিত্তিতে প্রতিটি লাইনের উপসর্গ করে:

$ csort -t, '2=United States' X 2=Canada Y 2=Bahamas Z < tmp.csv | \
sort -t, -k1,1 -k3,3 -k4,4 -k5,5 -k6,6r -k7,7nr
X,A,United States,MA,Boston,f,0
X,B,United States,NY,New York,f,5
X,A,United States,NY,New York,f,1
X,C,United States,WA,Tacoma,f,1
Y,A,Canada,QC,Montreal,f,2
Z,A,Bahamas,Bahamas,Nassau,f,2

2=STRস্বরলিপি মানে হলো "ম্যাচ দ্বিতীয় ক্ষেত্র সমান যদি STR"।

এরপরে আপনি cut -c3-উপসর্গটি সরাতে আউটপুটটি optionচ্ছিকভাবে পাইপ করতে পারেন।

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