শুধুমাত্র এক কলামে ইউনিক্স বাছাই কিভাবে?


47

আমি জানি যে ইউনিক্স বাছাইয়ের জন্য -k বিকল্পটি আমাদের একটি নির্দিষ্ট কলাম এবং নীচের সমস্তগুলি অনুসারে বাছাই করতে দেয় । উদাহরণস্বরূপ, ইনপুট ফাইল দেওয়া:

2 3
2 2
1 2
2 1
1 1

ব্যবহার করে sort -n -k 1, আমি একটি আউটপুট 1 ম কলাম এবং তার পরে 2 য় অনুসারে বাছাই করব:

1 1
1 2
2 1
2 2
2 3

তবে আমি এইভাবে দ্বিতীয় কলামের ক্রম রাখতে চাই:

1 2
1 1
2 3
2 2
2 1

এই sortআদেশ দিয়ে কি সম্ভব ?

উত্তর:


64

একবার চেষ্টা করে দেখুন:

sort -s -n -k 1,1

-sঅক্ষম 'শেষ-অবলম্বন' বাছাই, যা সবকিছু যে একটি নির্দিষ্ট কী অংশ নয় ছিল বাছাই করে।

-k 1না আসলে গড় "এই ক্ষেত্র এবং নিচের সবগুলি" সাংখ্যিক সাজানোর প্রেক্ষাপটে মতো যদি আপনি দ্বিতীয় কলামে উপর সাজাতে চেষ্টা দেখতে পারেন। আপনি কেবল লাইনের বাকী অংশে গিয়ে সম্পর্কগুলি ভেঙে দেখতে পাচ্ছেন। তবে সাধারণভাবে, আপনাকে কেবলমাত্র এক ফিল্ডে -k 1,1বাছাই করতে হবে।


তুমি ঠিক. আমার ঠিক এটিই দরকার ছিল। ধন্যবাদ!

এই ধরণের আউটপুটটিতে যোগদান ব্যবহার করা সম্ভব?
MiNdFrEaK

@ মিএনডিএফআরইএকে: এর প্রয়োজনীয়তা joinহ'ল যে অংশগুলি আপনি যোগ দিচ্ছেন সেগুলিতে ইনপুটটি বাছাই করা উচিত। সুতরাং নিশ্চিত, এই আউটপুট প্রথম ক্ষেত্রে বাছাই করা হয়, এবং আপনি এতে যোগ দিতে পারেন।
ক্যাসাবেল

আমার 2 টি ফাইল রয়েছে যার একটিতে 2 টি কলাম রয়েছে, অন্যটিতে 1 টি কলাম রয়েছে। দ্বিতীয় ফাইলটি বাছাই করা হয় -u ব্যবহার করে। এখন টাস্কটি হচ্ছে আমার এই কলামটিতে প্রথম ফাইলটির প্রথম কলামটি যুক্ত হওয়া দরকার, যা সাজানো হয়নি, তাই বাক্য গঠনটি কী হবে? এই কাজ করবে? join -j 1 file2.txt সাজান -s -n -k 1 file1.txt?
MiNdFrEaK

1
-k 1,1( " , 1 " অংশ) কোনো ভালো আমার জন্য কাজ করে না। কি কাজ করে -s -k 1সঙ্গে, -nযদি আপনি এটি প্রয়োজন।
টোটার

10

প্রথম কলামটি কেবল সাজানোর জন্য আপনার করা উচিত:

sort -n -s -k1,1

থেকে ইউনিক্স এবং লিনাক্স সিস্টেম অ্যাডমিনিস্ট্রেশন হ্যান্ডবুক

সাজান কী স্পেসিফিকেশন -k3 গ্রহণ করে (-k3,3 এর পরিবর্তে), তবে এটি সম্ভবত আপনি প্রত্যাশা করেন না। সমাপ্তি ক্ষেত্রের নম্বর ছাড়া, বাছাই কীটি লাইনের শেষ অবধি চলে


আমার পক্ষে কাজ করছে না, -sক্যাসকাবেল নির্দেশিত হিসাবে আমার বিকল্পটি যুক্ত করা দরকার ।
জিন পল

@ জিনপল আপনি ঠিকই -sবলেছেন , ডকুমেন্টেশনের জন্য "এই বিকল্পটি সমান কী রয়েছে এমন রেকর্ডগুলির মূল রেকর্ড ক্রম বজায় রাখে" "
টিডবেক

2

প্রদত্ত উত্তরের কোনওটিই আমার পক্ষে সাধারণত কাজ করে না।

উভয়ই sort -s -k 2 file1এবং sort -n -k1,1এই ফাইলটি দিয়ে অতিরিক্ত বাছাই করুন:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

আমি ঠিক এই সঠিক জিনিসটি করতে হয়েছিল এবং একটি শেল লুপ ব্যবহার করে শেষ করেছি। এই সমাধানটি খুব বড় ফাইলটিতে খুব ভাল কাজ করতে পারে না কারণ বাছাই করা কলামে প্রতিটি অনন্য মানের জন্য পুরো ফাইলটি পড়তে হবে।

এখানে ফাইলটি কেবল 2 কলামে বাছাই করা হয়েছে।

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
plhn

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