একটি ফাইলের প্রতিটি কলামের যোগফল গণনা করুন


9

স্পেস '' দ্বারা সীমানাযুক্ত বিভিন্ন সংখ্যক কলাম সহ একটি ফাইলে, কীভাবে কলামগুলির যোগফল গণনা করা যায়। একটি উদাহরণ প্রয়োজন দেখায়:

File A:

1 2 
2 3
4 5 6 
1 1 1 5

তারপরে আউটপুটটি হবে:

  • কলাম 1 (1 + 2 + 4 + 1) = 8 এর জন্য
  • কলাম 2 জন্য 11
  • 3 কলামের জন্য 7
  • 4 কলামের জন্য 5

উত্তর:


12

ব্যবহার awk

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print "for column "i" is " sum[i];}' FileA
for column 1 is 8
for column 2 is 11
for column 3 is 7
for column 4 is 5

অ্যারেগুলির ভাল ব্যবহার যদিও আমি মনে করি এটি কেবলমাত্র অঙ্কের গণনা করা এবং এখনই এটি মুদ্রণ করা সহজ হতে পারে
সের্গি কোলোডিয়াজহনি

প্রকৃতপক্ষে এটি এখানে সেরা উত্তর।
কোস

5

numsumসেই কাজের জন্য ব্যবহার করুন এবং ডেটা প্রসেসিং এবং ফলাফলগুলির ফলাফলের মধ্যে পৃথক করুন।

ইনস্টল করুন num-utils, আমাদের দরকারnumsum

sudo apt-get install num-utils

এবং দিয়ে শুরু

numsum -c <your_file_name>

উদাহরণ

$ cat "File A"
1 2 
2 3
4 5 6 
1 1 1 5

$ numsum -c "File A"
8 11 7 5

বা আপনার পছন্দসই বিন্যাস সহ:

$ numsum -c "File A" | awk '{for(i=1;i<=NF;i++) {print "for column "i" is "$i}}'
for column 1 is 8
for column 2 is 11
for column 3 is 7
for column 4 is 5

থেকে man numsum

-c      Print out the sum of each column.

থেকে উদাহরণ man numsum

EXAMPLES

   Add up the 1st, 2nd and 5th columns only.

       $ numsum -c -x 1,2,5 columns
       15 40 115

   Add up the rows of numbers of a file.

        $ numsum -r columns
        55
        60
        65
        70
        75

3
#!/bin/sh

while read a b c d; do
    col1=$((col1 + a))
    col2=$((col2 + b))
    col3=$((col3 + c))
    col4=$((col4 + d))
done < File_A

echo $col1 $col2 $col3 $col4

আপনি সম্ভবত (( col1 += a )), ইত্যাদি বলতে পারেন , এছাড়াও echo "..."নিরাপদ, পাশাপাশিwhile IFS= read -r ...
ফেডোরকি

@ ফেডরকিই echoএইভাবে সংখ্যার প্রতিধ্বনির জন্য ব্যবহার করা নিরাপদ, শ্বেত স্পেসে $IFSডিফল্ট এবং সেগুলি সংখ্যা হওয়ার আশা করা হয়, তাই ব্যাকস্ল্যাশগুলি মোকাবেলা করার দরকার নেই। এই উত্তরের একমাত্র নেতিবাচকতা হ'ল কার্যকর করার পূর্বে কলামগুলির সংখ্যা জানার প্রয়োজন।
কোস

@ কোস আপনি কখনই ইনপুট ফাইল হতে পারে তা জানতে পারবেন না। এবং ওপি কেবলমাত্র সংখ্যার উল্লেখ করলেও আরও খারাপের জন্য প্রস্তুত করা সর্বদা ভাল অনুশীলন। দেখুন কীভাবে আমি কোনও ফাইল (ডেটা স্ট্রিম, ভেরিয়েবল) লাইন বাই লাইন (এবং / অথবা ক্ষেত্রের বাইরের ক্ষেত্র) পড়তে পারি? একটি দুর্দান্ত ব্যাখ্যা জন্য।
ফেডোরকিউ

@ ফেডোরকিই আপনার নিজের বক্তব্য অনুযায়ী আমি চেয়েছিলাম এটি আলোচনার বাইরে রয়েছে; আপনি যদি ইনপুট ফাইলটিতে সংখ্যা ব্যতীত অন্য কিছু থাকতে পারে এমন ধারণা ধরে পয়েন্টগুলি বানাতে চান তবে আপনি খোলামেলা অংশটি মিস করছেন: যা পড়েছে তা একটি নম্বর কিনা তা পরীক্ষা করা। স্ট্রিং যুক্ত করা এবং echo "[...]"আপনি যে ফলাফলটি আউটপুট করতে চান না তা সঠিকভাবে মুদ্রণ করতে কোনও অর্থ হয় না।
কোস

@ কোস আপনি অবশ্যই বলতে পারেন echo $varএবং while read a b cএটি এখানে কাজ করে। তবে, আপনি এটি একটি দুর্বল উপায়ে লিখতে অভ্যস্ত হয়ে যাবেন এবং একদিন আরও জটিল ফাইল প্রক্রিয়াকরণের সময় আপনি অদ্ভুত ত্রুটি পাবেন। তারপরে আপনি ভেরিয়েবলগুলি উদ্ধৃত করা এবং ব্যবহার while IFS= read -r ...করা নিরাপদ দেখবেন এবং বলবেন "ওহ হ্যাঁ ফেডোরকি ঠিক ছিল, আমি আশা করি তাকে কৃতজ্ঞতা জানাতে আমি তাকে জড়িয়ে ধরতে পারি!"!
ফেডোরকুই

3

আপনার নিজের উত্তরের মন্তব্যে বিচার করে আপনি একবারে কেবল একটি কলামের যোগফল চান। যদি তা হয় তবে এটি করার জন্য এখানে একটি অবাস্তব উপায়:

cut -d' ' -f3 FileA | grep . | paste -s -d+ | bc

যেখানে আপনি 3আগ্রহী কলাম নম্বরটি দিয়ে প্রতিস্থাপন করবেন ।


0

এখানে একটি ওয়ান-লাইনার পার্ল স্ক্রিপ্ট পদ্ধতি রয়েছে। এটি -aফ্ল্যাগের ব্যবহারের উপর নির্ভর করে যা বর্তমানে অ্যারোতে -nপতাকা সহ পড়া পংক্তিকে স্বয়ংক্রিয়ভাবে বিভক্ত করতে দেয় @F। আমাদের যা করতে হবে তা হ'ল সেই আইটেমগুলির পুনরাবৃত্তি, এবং $sumএটিকে তাদের নিজ নিজ সূচীতে অ্যারেতে যুক্ত করুন, এইভাবে কার্যকরভাবে প্রতিটি অ্যারে আইটেম প্রতিটি স্ব স্তরের জন্য যোগফল। শেষ পর্যন্ত, আমরা ফলাফল ENDকোড ব্লকের মধ্যে মুদ্রণ ।

$ perl -lane '$j=0;foreach $i (@F){$sum[$j]+=$i; $j+=1;}; END{print join("\n",@sum)} ' input.txt                                                     
8
11
7
5

বিকল্পভাবে, এখানে একটি সম্পূর্ণ পার্ল স্ক্রিপ্ট পদ্ধতির। এটি প্রতিটি রেখাকে অ্যারেতে বিভক্ত করার উপর নির্ভর করে এবং অ্যারেতে প্রতিটি আইটেমকে পুনরুক্ত করে প্রতিটি সংখ্যাকে অ্যারেতে তাদের নিজ নিজ সম্ভাবনায় যুক্ত করে @sums। স্ক্রিপ্ট প্রতিটি লাইন প্রিন্ট করে, তারপরে প্রতিটি কলামের জন্য প্রতিবেদন তৈরি করে। প্রতিটি লাইন মুদ্রণ #আগে যোগ করে মুছে ফেলা যাবেprintf("%s",$line);

#!/usr/bin/env perl
use strict;
use warnings;

open(my $fh,"<",$ARGV[0]); 
my $i = 0;
my @sums;

while(my $line = <$fh>) { 
    printf("%s",$line);
    my @nums = split(" ",$line);
    my $j = 0;
    foreach my $num (@nums){
        $sums[$j] += $num;
        $j += 1;
    }

}

my $k = 0;
foreach my $sum (@sums){
    printf("- column %d sum: %d\n",$k,$sum);
    $k+=1;
}

close($fh);

ব্যবহার সহজ chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt। উদাহরণ স্বরূপ:

$ ./sum_columns_2.pl input.txt                                                                                                                       
1 2 
2 3
4 5 6 
1 1 1 5
- column 0 sum: 8
- column 1 sum: 11
- column 2 sum: 7
- column 3 sum: 5

-2

একটি সহজ সমাধান:

awk '{sum += $i} END {print sum}' file

কলাম নম্বর দিয়ে কলাম নম্বর দিয়ে আই প্রতিস্থাপন করুন:

awk '{sum += $1} END {print sum}' file

আউটপুট হল:

8

3
এটি কেবল আপনাকে একটি কলাম দেয়। আপনি নিজের স্পেসিফিকেশন পূরণ করছেন না।
অলি

আমি বলিনি যে আমি একই কমান্ডে সমস্ত ফলাফল চাই। প্লাস এই উত্তরটির জন্য কেবল একটি লুপ দরকার এবং এটি নিখুঁত হতে পারে
মেথাক্স

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