ব্যাশে কলামে অনন্য মানের গণনা পাওয়া


98

আমার বেশ কয়েকটি কলাম সহ ট্যাব সীমিত ফাইল রয়েছে। আমি একটি ফোল্ডারে সমস্ত ফাইলের জন্য একটি কলামে বিভিন্ন মানগুলির সংঘটনগুলির গণনা গণনা করতে চাই এবং তাদের গণনার ক্রমক্রমে ক্রম অনুসারে বাছাই করতে চাই (সর্বোচ্চ গণনা আগে)। আমি লিনাক্স কমান্ড লাইনের পরিবেশে এটি কীভাবে সম্পাদন করব?

এটি যে কোনও সাধারণ কমান্ড লাইন ভাষা যেমন awk, পার্ল, পাইথন ইত্যাদি ব্যবহার করতে পারে

উত্তর:


156

দুটি কলামের জন্য ফ্রিকোয়েন্সি গণনা দেখতে (উদাহরণস্বরূপ):

awk -F '\t' '{print $2}' * | sort | uniq -c | sort -nr

fileA.txt

z    z    a
a    b    c
w    d    e

fileB.txt

t    r    e
z    d    a
a    g    c

fileC.txt

z    r    a
v    d    c
a    m    c

ফলাফল:

  3 d
  2 r
  1 z
  1 m
  1 g
  1 b

69

শেলটিতে এটি করার একটি উপায় এখানে রয়েছে:

FIELD=2
cut -f $FIELD * | sort| uniq -c |sort -nr

এই ধরণের জিনিসটি বাশ এ দুর্দান্ত।


23
জিনিস "ধরণের" ... আর আর আর! :)
জন রিক্স

4
কিন্ডা বাছাই অনন্য জিনিস। : পি (বিটিডাব্লু। -d,কমা বা অন্য কোনও সীমানা দ্বারা ক্ষেত্রগুলি সীমিত করতে ব্যবহার করুন)।
সিআরপিএন

4
আমি ব্যবহৃত cut -f 1 -d ' '। আপনাকে অনেক ধন্যবাদ. :)
আলফোনসো নিশিকাওয়া

8

গনুহ সাইটে এই সুন্দর awk স্ক্রিপ্ট, যা উভয় শব্দ এবং তাদের ফ্রিকোয়েন্সি ছাপে দাড়ায়।

সম্ভাব্য পরিবর্তনগুলি:

  • উতরান ক্রমের ফলাফল দেখতে আপনি sort -nr(এবং বিপরীত wordএবং freq[word]) মাধ্যমে পাইপ করতে পারেন।
  • আপনি যদি একটি নির্দিষ্ট কলাম চান, আপনি লুপের জন্য বাদ দিতে পারেন এবং কেবল লিখতে পারেন freq[3]++- কলাম নম্বর দিয়ে 3 প্রতিস্থাপন করুন।

এখানে যায়:

 # wordfreq.awk --- print list of word frequencies

 {
     $0 = tolower($0)    # remove case distinctions
     # remove punctuation
     gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
     for (i = 1; i <= NF; i++)
         freq[$i]++
 }

 END {
     for (word in freq)
         printf "%s\t%d\n", word, freq[word]
 }

4
দুর্দান্ত উদাহরণ লিপি। এটি awk এর সক্ষমতা এতটা প্রদর্শন করে।
ডেভিড মান

এই স্ক্রিপ্টটি আমার পক্ষে এক্সেল ওয়ার্কবুকের কোন সারিগুলিতে সত্যই মনোযোগ দেওয়ার প্রয়োজন তা নির্ধারণ করতে আমার সহায়ক হয়েছিল :) (পাঠ্য ফাইলটিতে এক্সেল সামগ্রী অনুলিপি করা, জাজ ব্যবহার করা এবং ভয়েলা !, আমি গ্রেপ-এন এর জন্য একটি প্যাটার্ন ফাইল তৈরি করতে পারি) ।
জুবলস

6

পার্ল

এই কোডটি সমস্ত কলামের উপস্থিতি গণনা করে এবং তাদের প্রত্যেকের জন্য একটি সাজানো প্রতিবেদন মুদ্রণ করে:

# columnvalues.pl
while (<>) {
    @Fields = split /\s+/;
    for $i ( 0 .. $#Fields ) {
        $result[$i]{$Fields[$i]}++
    };
}
for $j ( 0 .. $#result ) {
    print "column $j:\n";
    @values = keys %{$result[$j]};
    @sorted = sort { $result[$j]{$b} <=> $result[$j]{$a}  ||  $a cmp $b } @values;
    for $k ( @sorted ) {
        print " $k $result[$j]{$k}\n"
    }
}

পাঠ্যটি কলামওয়ালু হিসাবে সংরক্ষণ করুন.পিএল
এটি হিসাবে চালান: perl columnvalues.pl files*

ব্যাখ্যা

লুপের সময় শীর্ষ স্তরে:
* সম্মিলিত ইনপুট ফাইলগুলির প্রতিটি লাইন ধরে লুপ করুন
* লাইনটি @ ফিল্ডস অ্যারেতে বিভক্ত করুন
* প্রতিটি কলামের জন্য ফলাফল অ্যারে অফ-হ্যাশ ডেটা কাঠামো বৃদ্ধি করুন

লুপের জন্য শীর্ষ স্তরে:
* ফলাফলের অ্যারের উপরে লুপ
করুন * কলাম নম্বরটি মুদ্রণ করুন * সেই কলামে
ব্যবহৃত মানগুলি অর্জন করুন * সংখ্যার সংখ্যা
অনুসারে মানগুলি বাছাই করুন * মানের
ভিত্তিতে গৌণ সাজান (উদাহরণস্বরূপ বি বনাম জি বনাম) মি বনাম z)
* বাছাই করা তালিকা ব্যবহার করে ফলাফলের হ্যাশটির মাধ্যমে আইট্রেট
করুন * প্রতিটি সংখ্যার মান এবং সংখ্যা মুদ্রণ করুন

@ ডেনিস দ্বারা সরবরাহিত নমুনা ইনপুট ফাইলের ভিত্তিতে ফলাফল

column 0:
 a 3
 z 3
 t 1
 v 1
 w 1
column 1:
 d 3
 r 2
 b 1
 g 1
 m 1
 z 1
column 2:
 c 4
 a 3
 e 2

.csv ইনপুট

যদি আপনার ইনপুট ফাইলগুলি .csv হয় তবে এতে পরিবর্তন /\s+/করুন/,/

অবরুদ্ধকরণ

কুরুচিপূর্ণ প্রতিযোগিতায় পার্ল বিশেষভাবে সজ্জিত।
এই ওয়ান-লাইনার একই কাজ করে:

perl -lane 'for $i (0..$#F){$g[$i]{$F[$i]}++};END{for $j (0..$#g){print "$j:";for $k (sort{$g[$j]{$b}<=>$g[$j]{$a}||$a cmp $b} keys %{$g[$j]}){print " $k $g[$j]{$k}"}}}' files*

2

রুবি (১.৯+)

#!/usr/bin/env ruby
Dir["*"].each do |file|
    h=Hash.new(0)
    open(file).each do |row|
        row.chomp.split("\t").each do |w|
            h[ w ] += 1
        end
    end
    h.sort{|a,b| b[1]<=>a[1] }.each{|x,y| print "#{x}:#{y}\n" }
end

5
এটি অত্যন্ত আকর্ষণীয়, উভয়ই আমি এটি ব্যবহার করেছি এবং এটি কাজ করেছিল, এবং কারণ আমি কেবল কুৎসিত রুবি কী তা দেখে অবাক হয়েছি .. আমি ভেবেছিলাম পার্লটি খারাপ ছিল!
রায়ানস্ট্যাক

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