প্রতি লাইনে শব্দের সংখ্যার সাহায্যে লাইনগুলি সাজান


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 একই জিনিসটি ভাবছিল: তবে সম্ভবত একটির অবশ্যই মনে করা উচিত যে এতে ইনপুটটি ডি-ডুপ্লিকেট করার পার্শ্ব প্রতিক্রিয়া হবে
স্টিল্ড্রাইভার

@ স্টাইলড্রাইভার আপনি একেবারে সঠিক, আমি আমার উত্তর সম্পাদনা করেছি, এখনই ঠিক হওয়া উচিত।
জিম্মিজ

এটি এখন একই সংখ্যার ক্ষেত্রের সাথে রেকর্ডের মধ্যে মূল ক্রম সংরক্ষণ করে, গৌণ বাছাই কী হিসাবে শব্দগুলিকে বাছাই করার পরিবর্তে। আপনার কীগুলি থাকলে আপনার কাছে NF" "$0" "NRকেবল NRএকটি ফ্যালব্যাক / সদৃশ হ্যান্ডলিং ব্যবস্থা ছিল।
পিটার কর্ডেস

1
@ পিটারকর্ডস তবে এটি শব্দের ক্রমকে বিপরীত করবে, আমি বর্ণানুক্রমিকভাবে সম্পর্কগুলি সমাধানের কোনও উপায় দেখতে পাচ্ছি না যে সংজ্ঞায়নের নিজস্ব ক্রিয়াকলাপে 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="")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.