कॉलम 3 द्वारा awk सॉर्ट का उपयोग कैसे करें


90

मेरे पास इस तरह एक फ़ाइल (user.csv) है

ip,hostname,user,group,encryption,aduser,adattr

उपयोगकर्ता द्वारा सभी स्तंभ प्रकार मुद्रित करना चाहते हैं,

मैंने कोशिश की awk -F ":" '{print|"$3 sort -n"}' user.csv, यह काम नहीं करता है।


11
sort -t, -k3 file
केविन

जवाबों:


174

कैसे बस sort?

sort -t, -nk3 user.csv

कहाँ पे

  • -t,- अपने सीमांकक को परिभाषित करता है ,

  • -n- आप संख्यात्मक प्रकार देता है। जब से आपने इसे अपने प्रयास में जोड़ा है। यदि आपका उपयोगकर्ता फ़ील्ड केवल पाठ है तो आपको इसकी आवश्यकता नहीं है।

  • -k3- क्षेत्र (कुंजी) को परिभाषित करता है। उपयोगकर्ता तीसरा क्षेत्र है।


2
मैं सॉर्ट 2 कॉलम का उपयोग कैसे कर सकता हूं? उदाहरण के लिए, मैं पहले कॉलम 6 से सॉर्ट करना चाहता हूं, और कॉलम 3 सेकंड द्वारा सॉर्ट करना।
user2452340

1
यह तब तक काम नहीं करेगा जब CSV में अल्पविराम वाले उद्धरण दिए गए हों (जब तक कि जिस कॉलम को आप सॉर्ट करना चाहते हैं वह कॉमा युक्त कॉलम से पहले हो)। आपको पहले awk के साथ एक पास बनाना पड़ सकता है (FPAT = "[^,] * | | \" [^ \ "] * \" "और OFS =" | "या कुछ अन्य परिसीमन जिसे आप क्रमबद्ध तरीके से उपयोग कर सकते हैं)
davemyron

1
@ user2452340 आप ऐसा कर सकते हैं: sort -t, -nk3 filename.csv | sort -t, -nk6- पहले यह कॉलम 3 के आधार पर छाँटेगा , फिर कॉलम 6 को छाँटेगा ताकि स्तंभ 6 को सभी तरह से सही ढंग से क्रमबद्ध किया जा सके और किसी भी पंक्तियों के लिए जहाँ स्तंभ 6 समान है, उनको कॉलम 1 द्वारा क्रमबद्ध किया जाएगा ।
मैथ्यू

3
@ मैथ्यू sort -t ',' -k3,3n -k6,6nबेहतर होगा। -k3कॉलम 3 और शेष पंक्ति का उपयोग करेगा।
कुसलानंद

1
मुझे सिर्फ -t की जरूरत है, मेरी 2 कॉलम फाइल को कॉमा से विभाजित करने के लिए, धन्यवाद जयपाल
रिकार्डो रिवेरा

20
  1. उपयोगकर्ता आईडी को सामने रखने के लिए awk का उपयोग करें।
  2. तरह
  3. डुप्लिकेट उपयोगकर्ता आईडी को हटाने के लिए sed का उपयोग करें, यह मानते हुए कि उपयोगकर्ता आईडी में कोई रिक्त स्थान नहीं है।

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

यह बहुत उपयोगी है, खासकर यदि आपको सॉर्ट फ़ील्ड जोड़ने के लिए स्तंभों को पार्स या संयोजित करने की आवश्यकता है, तो केवल मूल पंक्ति को बनाए रखें। मैं एक प्रकार के लिए दिनांक / समय फ़ील्ड को पार्स / संयोजित करने के लिए awk / विभाजन का उपयोग करता था, फिर हटा देता हूं।
स्किटेकर

1
sortपहले से ही जानता है कि किसी विशेष कॉलम को कैसे छांटना है, लेकिन यह तकनीक - जिसे श्वार्ट्जियन ट्रांसफॉर्म के रूप में जाना जाता है - तब उपयोगी होता है जब आप जिस क्षेत्र को छांटना चाहते हैं वह तुच्छ रूप से परिभाषित स्तंभ नहीं है।
ट्रिपल

10

आप एक सीमांकक चुन सकते हैं, इस मामले में मैंने एक बृहदान्त्र चुना और वर्णमाला क्रम से छँटते हुए कॉलम नंबर एक को मुद्रित किया:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

और रिवर्स ऑर्डर के लिए

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 



0

पहली पंक्ति (हेडर) को छंटाई से बाहर करने के लिए, मैंने इसे दो बफ़र्स में विभाजित किया।

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.