it-swarm.asia

كيفية UNIX الفرز حسب عمود واحد فقط؟

أعلم أن خيار -k الخاص بترتيب Unix يسمح لنا بالفرز حسب عمود معين وكل ما يلي . على سبيل المثال ، بالنظر إلى ملف الإدخال:

2 3
2 2
1 2
2 1
1 1

باستخدام sort -n -k 1 ، أحصل على إخراج مرتبة حسب العمود الأول ثم الثاني:

1 1
1 2
2 1
2 2
2 3

ومع ذلك ، أريد الاحتفاظ بترتيب العمود الثاني ، مثل هذا:

1 2
1 1
2 3
2 2
2 1

هل هذا ممكن مع الأمر sort؟

46
ssn

جرب هذه:

sort -s -n -k 1,1

يقوم -s بتعطيل الفرز "الملاذ الأخير" ، والذي يصنف كل شيء لم يكن جزءًا من مفتاح محدد.

لا يعني -k 1 فعليًا "هذا الحقل وكل ما يلي" في سياق الفرز الرقمي ، كما يمكنك معرفة ما إذا كنت تحاول الفرز في العمود الثاني. تشاهد مجرد قطع العلاقات عن طريق الذهاب إلى بقية السطر. بشكل عام ، ومع ذلك ، تحتاج إلى تحديد -k 1,1 للفرز فقط في الحقل الأول.

62
Cascabel

لفرز العمود الأول فقط ، يجب عليك القيام بما يلي:

sort -n -s -k1,1

من دليل إدارة نظام يونكس ولينكس

يقبل الفرز المواصفات الرئيسية -k3 (بدلاً من -k3،3) ، لكن من المحتمل ألا يفعل ما تتوقعه. بدون رقم حقل الإنهاء ، يستمر مفتاح الفرز حتى نهاية السطر

10
tidbeck

لا شيء من الإجابات المقدمة تعمل بشكل عام بالنسبة لي.

يقوم كل من 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

كان علي فعل هذا الشيء بالضبط وانتهى بي الأمر باستخدام حلقة Shell. قد لا يعمل هذا الحل بشكل جيد على ملف كبير جدًا لأن الملف بأكمله يحتاج إلى قراءة لكل قيمة فريدة في العمود الذي تم الفرز.

هنا يتم فرز الملف في العمود 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
2
user680341