प्रति पंक्ति शब्दों की संख्या के आधार पर क्रमबद्ध करें


14

दिए गए इनपुट:

hello: world foo bar baz
bar:
baz: bin boop bop fiz bang beep
bap: bim bam bop
boatkeeper: poughkeepsie

मैं इसे शीर्ष पर अधिकांश शब्दों में क्रमबद्ध करना चाहूंगा, कम से कम अंत में, जैसे:

baz: bin boop bop fiz bang beep
hello: world foo bar baz
bap: bim bam bop
boatkeeper: poughkeepsie
bar:

मैं इसे sortया किसी अन्य उपकरण के साथ कैसे करूंगा ?


बस स्पष्ट होने के लिए, आप शब्दों की संख्या को लाइन की लंबाई के अनुसार क्रमबद्ध नहीं करना चाहते हैं (आपके नमूना इनपुट के साथ सबसे अधिक शब्दों के साथ लाइन भी सबसे लंबी है लेकिन हमेशा ऐसा नहीं हो सकता है)?
don_crissti

हाँ। सबसे अधिक शब्दों वाली लाइन सामान्य रूप से सबसे लंबी नहीं होती है। जैसे मुझे bin: bop boopपहले चाहिए boatkeeper: poughkeepsie। यदि दो पंक्तियाँ समान संख्या में शब्द साझा करती हैं, तो मैं संबंधों को वर्णानुक्रम में रखना पसंद करूंगा, लेकिन यह कोई आवश्यकता नहीं है।
कालेब जू

जवाबों:


22

आप कुछ ऐसा कर सकते हैं:

awk '{print NF,$0}' file | sort -nr | cut -d' ' -f 2-

हम awkप्रत्येक पंक्ति में फ़ील्ड की संख्या को उपसर्ग करने के लिए उपयोग करते हैं। हम फिर sortउस नंबर से और इसे हटा देते हैं cut


यह काम किया। सोच रहा था कि आदेश उलटा क्यों पड़ा, लेकिन मुझे अब आपका संपादन दिखाई दे रहा है।
कालेब जू

6

हाल ही में GNU में सरणी सहित कई आंतरिक मापदंडों को परिभाषित करने के awkलिए PROCINFOसरणी का उपयोग किया जा सकता है जिसमें सरणी तत्व मुद्रित होते हैं (तत्व द्वारा नियंत्रित "sorted_in")। इस प्रकार हम निर्मित कर सकते हैं और अनुक्रमित कर सकते हैं, के मूल्य के साथ NF" "NRकिन तत्वों का मूल्य है $0और इसे वांछित आउटपुट में प्रिंट करें, आपके मामले में यह होगा "@ind_num_desc":

awk '{a[NF" "NR]=$0}END{PROCINFO["sorted_in"]="@ind_num_desc"; for(i in a) print a[i]}' file

1
+1 एक ही बात सोच रहा था: हालाँकि किसी को शायद इस बात पर ध्यान देना चाहिए कि इनपुट को डुप्लिकेट करने का साइड इफेक्ट होगा
स्टीलड्राइव

@steeldriver आप बिल्कुल सही हैं, मैंने अपना जवाब संपादित किया, अब ठीक होना चाहिए।
jijij

अब यह शब्दों के बीच मूल क्रम को संरक्षित करता है, शब्दों के बजाय माध्यमिक सॉर्ट कुंजी के रूप में छांटने के बजाय। यदि आपकी चाबियाँ थीं NF" "$0" "NR, तो आपके पास केवल NRएक फ़ॉलबैक / डुप्लिकेट-हैंडलिंग तंत्र होगा।
पीटर कॉर्ड्स

1
@PeterCordes लेकिन यह शब्दों के क्रम को उलट देगा, मुझे वर्णानुक्रमिक रूप से अन्य को हल करने का कोई तरीका नहीं दिखता है जो कि परिभाषा के स्वयं के कार्य से है cmp_func()- gnu awk अनुमति देता है।
jimmij

5

पर्ल वन-लाइनर:

print sort { split(' ',$a) <=> split(' ',$b) } <>;

यदि आप वर्णमाला क्रम का उपयोग करके संबंधों को तोड़ना चाहते हैं:

print sort { split(' ',$a) <=> split(' ',$b) or $a cmp $b } <>;

4

अजगर के माध्यम से।

s = '''hello: world foo bar baz
bar:
baz: bin boop bop fiz bang beep
bap: bim bam bop'''.splitlines()
for i in sorted(s, key=lambda x: len(x.split()), reverse=True):
    print(i)

या

with open('/path/to/the/input/file') as f:
    m = f.readlines()
    for i in sorted(m, key=lambda x: len(x.split()), reverse=True):
        print(i, end="")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.