क्या एक ही कमांड में संख्याओं की सूची में न्यूनतम, अधिकतम, औसत और औसत प्राप्त करने का एक तरीका है?


93

मेरे पास एक फ़ाइल में संख्याओं की एक सूची है, प्रति पंक्ति एक। मैं न्यूनतम, अधिकतम, औसत और औसत मूल्य कैसे प्राप्त कर सकता हूं ? मैं बैश स्क्रिप्ट में परिणामों का उपयोग करना चाहता हूं।

यद्यपि मेरी तत्काल स्थिति पूर्णांकों के लिए है, फ़्लोटिंग-पॉइंट संख्याओं के लिए एक समाधान लाइन के नीचे उपयोगी होगा, लेकिन एक सरल पूर्णांक विधि ठीक है।


जवाबों:


50

आप आर प्रोग्रामिंग भाषा का उपयोग कर सकते हैं

यहाँ एक त्वरित और गंदा आर स्क्रिप्ट है:

#! /usr/bin/env Rscript
d<-scan("stdin", quiet=TRUE)
cat(min(d), max(d), median(d), mean(d), sep="\n")

नोट "stdin"में scanजो मानक इनपुट से पढ़ने के लिए एक विशेष फ़ाइल नाम है (कि पाइप या पुनर्निर्देशन से मतलब है)।

अब आप अपने डेटा को R स्क्रिप्ट पर R पर पुनर्निर्देशित कर सकते हैं:

$ cat datafile
1
2
4
$ ./mmmm.r < datafile
1
4
2
2.333333

अस्थायी बिंदुओं के लिए भी काम करता है:

$ cat datafile2
1.1
2.2
4.4
$ ./mmmm.r < datafile2
1.1
4.4
2.2
2.566667

यदि आप R स्क्रिप्ट फ़ाइल नहीं लिखना चाहते हैं तो आप कमांड लाइन का उपयोग करके एक सच्चे वन-लाइनर (केवल पठनीयता के लिए लाइनब्रेक के साथ) का उपयोग कर सकते हैं Rscript:

$ Rscript -e 'd<-scan("stdin", quiet=TRUE)' \
          -e 'cat(min(d), max(d), median(d), mean(d), sep="\n")' < datafile
1
4
2
2.333333

ठीक R मैनुअल को http://cran.r-project.org/manuals.html पर पढ़ें ।

दुर्भाग्य से पूर्ण संदर्भ केवल पीडीएफ में उपलब्ध है। एक अन्य तरीका संदर्भ को पढ़ने के लिए ?topicnameएक इंटरैक्टिव आर सत्र के संकेत में लिखकर है।


पूर्णता के लिए: एक आर कमांड है जो आपके द्वारा वांछित सभी मूल्यों को आउटपुट करता है और अधिक। दुर्भाग्य से एक मानव हितैषी प्रारूप में, जो प्रोग्रामेटिक रूप से पार्स करना कठिन है।

> summary(c(1,2,4))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.500   2.000   2.333   3.000   4.000 

1
यह दिलचस्प लग रहा है .. मैं कल इसे करीब से देखूंगा .. विकिपीडिया के पृष्ठ के आधार पर, "आर सांख्यिकीविदों के बीच एक वास्तविक मानक बन गया है" ... अच्छी तरह से यह एक महत्वपूर्ण प्रशंसा है ... मैंने अभिनय करने के लिए इसे खोदने की कोशिश की दूसरे दिन (मैं इसका उल्लेख करता हुआ देखता रहा), लेकिन मैं इसे उबंटू रेपो में नहीं पा सका ... मैं कल इसका पालन करूंगा ...
पीटर

10
ubuntu (और डेबियन?) रेपो पैकेज का नाम है r-base
चम्मन

धन्यवाद, मुझे उस नाम के संदर्भ की आवश्यकता थी :) मैंने synaptic खोज क्षेत्र में r- के बारे में नहीं सोचा था और यह एक अकेला चरित्र पर काम नहीं करता है ... मैंने इसे अभी आज़माया है, और यह आदर्श लगता है .. Rइस स्थिति में मेरी आवश्यकता के लिए भाषा स्पष्ट रूप से सबसे अच्छी है .. गिल्स के उत्तर के अनुसार, Rscriptस्क्रिप्ट फ़ाइलों के लिए इंटरफ़ेस सबसे उपयुक्त है (बनाम R, जो कि इंटरएक्टिव इंटरफ़ेस है) ... और टर्मिनल में आर एक आसान कैलकुलेटर के लिए बनाता है , या परीक्षण वातावरण (जैसे अजगर :)
पीटर।

(+1) मैं आर को प्यार करता हूं। मैं इसे पर्याप्त रूप से सुझा नहीं सकता।
दस्सन

6
या बसcat datafile | Rscript -e 'print(summary(scan("stdin")));'
shabbychef

52

मैं वास्तव में संख्यात्मक डेटा (एकल संख्या सहित) के एक स्तंभ के औसत, माध्य डेटा, न्यूनतम डेटा, अधिकतम डेटा, माध्य और माध्यिका देने के लिए थोड़ा अजीब कार्यक्रम रखता हूं:

#!/bin/sh
sort -n | awk '
  BEGIN {
    c = 0;
    sum = 0;
  }
  $1 ~ /^(\-)?[0-9]*(\.[0-9]*)?$/ {
    a[c++] = $1;
    sum += $1;
  }
  END {
    ave = sum / c;
    if( (c % 2) == 1 ) {
      median = a[ int(c/2) ];
    } else {
      median = ( a[c/2] + a[c/2-1] ) / 2;
    }
    OFS="\t";
    print sum, c, ave, median, a[0], a[c-1];
  }
'

उपरोक्त स्क्रिप्ट स्टड से पढ़ता है, और एक ही लाइन पर आउटपुट के टैब-अलग किए गए कॉलम को प्रिंट करता है।


1
अहा! यह स्पष्ट है (अब जब मैंने आपकी awk स्क्रिप्ट देखी है :) ... सरणी के छँटे जाने पर न्यूनतम और अधिकतम जाँच करने की कोई आवश्यकता नहीं है :) और इसका मतलब है कि NR==1जा सकता है (बेकार-उपयोग-का- यदि) मिनट / अधिकतम जाँच के साथ, इसलिए सभी प्रारंभिक BEGIN अनुभाग में स्थित हो सकते हैं (अच्छा!) ... टिप्पणियों के लिए अनुमति देना एक अच्छा स्पर्श भी है .. धन्यवाद, +1 ...
पीटर

बस एक विचार .. शायद केवल संख्यावाचक को अनुमति देना टिप्पणियों को अस्वीकार करने से बेहतर है (लेकिन यह आपकी आवश्यकताओं पर निर्भर करता है) ..
पीटर

1
तकनीकी रूप से, awkमान लेंगे कि "नए" चर शून्य हैं, इसलिए इस मामले में BEGIN{}अनुभाग अनावश्यक है। मैंने रैपिंग तय कर ली है (लाइन ब्रेक से बचने की कोई आवश्यकता नहीं है)। मैंने भी लाइन OFS="\t"को साफ किया printऔर @ पीटर.ओ की दूसरी टिप्पणी को लागू किया। (हां, मेरा रेगेक्स अनुमति देता है ., लेकिन जैसा awkकि व्याख्या करता है 0, वह स्वीकार्य है।)
एडम काट्ज

1
@AdamKatz - ये महान परिवर्तन हैं, लेकिन जैसा कि यह खड़ा है, मैंने कार्यक्रम नहीं लिखा। मेरी awkस्क्रिप्ट अब काफी हद तक अलग है। मुझे लगभग ऐसा लगता है कि आपको क्रेडिट देने के लिए उपरोक्त कार्यक्रम के लिए क्रेडिट लेना चाहिए, जहां क्रेडिट देय है।
ब्रूस एडिगर

1
मैंने एक perl स्क्रिप्ट लिखी है जिसका नाम avg है जो ऐसा करता है और वैसे भी।
एडम काट्ज

47

GNU डेटामाश के साथ :

$ printf '1\n2\n4\n' | datamash max 1 min 1 mean 1 median 1
4   1   2.3333333333333 2

4
बैश के लिए अब तक का सबसे सरल उत्तर, जैसा कि पूछा गया है
rfabbri

3
brew install datamashयदि आप Hombrew स्थापित है, तो आप macOS के लिए एक कार्यशील संस्करण देते हैं।
प्रति लंडबर्ग

19

न्यूनतम, अधिकतम और औसत जाग के साथ प्राप्त करना बहुत आसान है:

% echo -e '6\n2\n4\n3\n1' | awk 'NR == 1 { max=$1; min=$1; sum=0 }
   { if ($1>max) max=$1; if ($1<min) min=$1; sum+=$1;}
   END {printf "Min: %d\tMax: %d\tAverage: %f\n", min, max, sum/NR}'
Min: 1  Max: 6  Average: 3,200000

माध्यिका की गणना करना थोड़ा अधिक कठिन है, क्योंकि आपको संख्याओं को क्रमबद्ध करना है और उन सभी को थोड़ी देर के लिए मेमोरी में स्टोर करना है या उन्हें दो बार पढ़ना है (पहली बार उन्हें गिनने के लिए, दूसरा - माध्य मान प्राप्त करने के लिए)। यहाँ उदाहरण है जो मेमोरी में सभी नंबरों को संग्रहीत करता है:

% echo -e '6\n2\n4\n3\n1' | sort -n | awk '{arr[NR]=$1}
   END { if (NR%2==1) print arr[(NR+1)/2]; else print (arr[NR/2]+arr[NR/2+1])/2}' 
3

धन्यवाद ... आपका उदाहरण मेरे लिए एक अच्छा लीड-इन जाग है, मैंने इसे थोड़ा ट्विक किया है और दोनों को एक साथ रखा है (जागने का एहसास हो रहा है) ... मैंने asortपाइप के बजाय awk का उपयोग किया है sort, और यह पूर्णांकों और दशमलवों को सही ढंग से क्रमबद्ध करने के लिए लगता है .. यहाँ मेरे परिणामी संस्करण paste.ubuntu.com/612674 का लिंक है ... (और किम को एक नोट: मैं अब कुछ घंटों के लिए awk के साथ प्रयोग कर रहा हूं व्यक्तिगत-रुचि उदाहरण के साथ काम करना मेरे लिए बेहतर है) ... पाठकों के लिए एक सामान्य टिप्पणी: मैं अभी भी अन्य तरीकों को देखने के लिए इच्छुक हूं। अधिक कॉम्पैक्ट बेहतर है। मैं थोड़ी देर इंतज़ार करूँगा ...
पीटर

17

pythonpy इस तरह की चीज़ के लिए अच्छा काम करता है:

cat file.txt | py --ji -l 'min(l), max(l), numpy.median(l), numpy.mean(l)'

17

न्यूनतम:

jq -s min

ज्यादा से ज्यादा:

jq -s max

माध्य:

sort -n|awk '{a[NR]=$0}END{print(NR%2==1)?a[int(NR/2)+1]:(a[NR/2]+a[NR/2+1])/2}'

औसत:

jq -s add/length

में ( ) विकल्प JSON के रूप में प्रत्येक पंक्ति को पार्स के बाद इनपुट लाइनों के लिए एक सरणी बनाता है, या इस मामले में एक नंबर के रूप में।jq-s--slurp


3
Jq समाधान एक विशेष उल्लेख के योग्य है, क्योंकि यह रसीला है, और गैर-स्पष्ट तरीके से टूल को पुन: प्रयोजन करता है।
jplindstrom

1
सुंदर! काश मैं +2
RASG

7
nums=$(<file.txt); 
list=(`for n in $nums; do printf "%015.06f\n" $n; done | sort -n`); 
echo min ${list[0]}; 
echo max ${list[${#list[*]}-1]}; 
echo median ${list[${#list[*]}/2]};

echo file.txtकाफी सही नहीं लगता है, शायदcat
malat

6

और एक पर्ल एक- (लंबी) लाइनर, जिसमें माध्यक शामिल है:

cat numbers.txt \
| perl -M'List::Util qw(sum max min)' -MPOSIX -0777 -a -ne 'printf "%-7s : %d\n"x4, "Min", min(@F), "Max", max(@F), "Average", sum(@F)/@F,  "Median", sum( (sort {$a<=>$b} @F)[ int( $#F/2 ), ceil( $#F/2 ) ] )/2;'

उपयोग किए जाने वाले विशेष विकल्प हैं:

  • -0777 : लाइन से लाइन के बजाय एक बार में पूरी फाइल पढ़ें
  • -a : @F सरणी में ऑटोसप्लिट

एक ही चीज़ का अधिक पठनीय स्क्रिप्ट संस्करण होगा:

#!/usr/bin/perl

use List::Util qw(sum max min);
use POSIX;

@F=<>;

printf "%-7s : %d\n" x 4,
    "Min", min(@F),
    "Max", max(@F),
    "Average", sum(@F)/@F,
    "Median", sum( (sort {$a<=>$b} @F)[ int( $#F/2 ), ceil( $#F/2 ) ] )/2;

यदि आप डेसीमल चाहते हैं, तो %dकुछ इस तरह से बदलें %.2f


6

सरल-आर का जवाब है:

r summary file.txt
r -e 'min(d); max(d); median(d); mean(d)' file.txt

यह सांख्यिकीय विश्लेषण को आसान बनाने के लिए आर पर्यावरण का उपयोग करता है।


5

इस पृष्ठ पर विभिन्न प्रकार के विकल्प प्रस्तुत करने के लिए, यहाँ दो और तरीके दिए गए हैं:

1: सप्तक

  • GNU ऑक्टेव एक उच्च-स्तरीय व्याख्या की गई भाषा है, जिसका मुख्य रूप से संख्यात्मक अभिकलन है। यह रैखिक और nonlinear समस्याओं के संख्यात्मक समाधान के लिए और अन्य संख्यात्मक प्रयोगों के प्रदर्शन के लिए क्षमताओं को प्रदान करता है।

यहाँ एक त्वरित सप्तक उदाहरण है।

octave -q --eval 'A=1:10;
  printf ("# %f\t%f\t%f\t%f\n", min(A), max(A), median(A), mean(A));'  
# 1.000000        10.000000       5.500000        5.500000

2: बैश + एकल-उद्देश्य उपकरण

फ़्लोटिंग पॉइंट संख्याओं को संभालने के लिए बैश के लिए, यह स्क्रिप्ट पैकेज से numprocessऔर उपयोग करता है ।numaveragenum-utils

पुनश्च। मैं भी एक उचित देखो bc, लेकिन इस विशेष काम के लिए, यह क्या awkकरता है से परे कुछ भी प्रदान नहीं करता है। यह ('b' राज्यों में 'c' के रूप में) एक कैलकुलेटर है - एक कैलकुलेटर जिसे बहुत प्रोग्रामिंग की आवश्यकता होती है awkऔर यह bash ...


arr=($(sort -n "LIST" |tee >(numaverage 2>/dev/null >stats.avg) ))
cnt=${#arr[@]}; ((cnt==0)) && { echo -e "0\t0\t0\t0\t0"; exit; }
mid=$((cnt/2)); 
if [[ ${cnt#${cnt%?}} == [02468] ]] 
   then med=$( echo -n "${arr[mid-1]}" |numprocess /+${arr[mid]},%2/ )
   else med=${arr[mid]}; 
fi     #  count   min       max           median        average
echo -ne "$cnt\t${arr[0]}\t${arr[cnt-1]}\t$med\t"; cat stats.avg 

4

मैं दुसरे चोले की आर की पसंद करूँगा और अपना पहला आर कार्यक्रम पेश करूँगा। यह मानक इनपुट पर प्रति पंक्ति एक नंबर पढ़ता है और मानक द्वारा रिक्त स्थान द्वारा अलग किए गए चार नंबर (न्यूनतम, औसत, औसत) लिखता है।

#!/usr/bin/env Rscript
a <- scan(file("stdin"), c(0), quiet=TRUE);
cat(min(a), max(a), mean(a), median(a), "\n");

"दूसरा" के लिए धन्यवाद (यह आश्वस्त है) ... आपका उदाहरण उपयोगी था, जैसा कि मुझे सीधे महसूस नहीं हुआ कि Rइंटरैक्टिव इंटरफ़ेस है, और Rscriptस्क्रिप्टेड फ़ाइलों को ड्राइव करता है, जो आपके उदाहरण हैश-बैंग के अनुसार निष्पादन योग्य हो सकता है , या एक बैश स्क्रिप्ट के भीतर से आह्वान किया .. स्क्रिप्ट कमांडलाइन आर्ग (जैसे। stackoverflow.com/questions/2045706/… ) को संभाल सकती है, इसलिए यह अच्छा लग रहा है ... इसके अलावा R अभिव्यक्तियों का उपयोग bash के माध्यम से किया जा सकता है -e... लेकिन मुझे आश्चर्य है कि कैसे Rतुलना करता है bc...
पीटर

2

नीचे sort/ awkअग्रानुक्रम यह करता है:

sort -n | awk '{a[i++]=$0;s+=$0}END{print a[0],a[i-1],(a[int(i/2)]+a[int((i-1)/2)])/2,s/i}'

(यह दो केंद्रीय मानों के मध्यमान की गणना करता है यदि मान गणना समान है)


2

ब्रूस के कोड से संकेत लेते हुए, यहां एक अधिक कुशल कार्यान्वयन है जो पूरे डेटा को स्मृति में नहीं रखता है। जैसा कि प्रश्न में कहा गया है, यह मानता है कि इनपुट फ़ाइल में (अधिकतम) एक नंबर प्रति पंक्ति है। यह इनपुट फ़ाइल में उन पंक्तियों को गिनता है जिनमें एक पात्रता संख्या होती है और awkक्रमबद्ध डेटा के साथ (पूर्ववर्ती) के साथ कमांड को गिनती पास करता है । इसलिए, उदाहरण के लिए, यदि फ़ाइल में है

6.0
4.2
8.3
9.5
1.7

तो awkवास्तव में इनपुट है

5
1.7
4.2
6.0
8.3
9.5

फिर awkस्क्रिप्ट NR==1कोड ब्लॉक में डेटा गणना को पकड़ती है और मध्य मान (या दो मध्य मान, जो औसतन उपज देने के लिए औसत होती है) को सहेजती है जब वह उन्हें देखता है।

FILENAME="Salaries.csv"

(awk 'BEGIN {c=0} $1 ~ /^[-0-9]*(\.[0-9]*)?$/ {c=c+1;} END {print c;}' "$FILENAME"; \
        sort -n "$FILENAME") | awk '
  BEGIN {
    c = 0
    sum = 0
    med1_loc = 0
    med2_loc = 0
    med1_val = 0
    med2_val = 0
    min = 0
    max = 0
  }

  NR==1 {
    LINES = $1
    # We check whether numlines is even or odd so that we keep only
    # the locations in the array where the median might be.
    if (LINES%2==0) {med1_loc = LINES/2-1; med2_loc = med1_loc+1;}
    if (LINES%2!=0) {med1_loc = med2_loc = (LINES-1)/2;}
  }

  $1 ~ /^[-0-9]*(\.[0-9]*)?$/  &&  NR!=1 {
    # setting min value
    if (c==0) {min = $1;}
    # middle two values in array
    if (c==med1_loc) {med1_val = $1;}
    if (c==med2_loc) {med2_val = $1;}
    c++
    sum += $1
    max = $1
  }
  END {
    ave = sum / c
    median = (med1_val + med2_val ) / 2
    print "sum:" sum
    print "count:" c
    print "mean:" ave
    print "median:" median
    print "min:" min
    print "max:" max
  }
'

यूनिक्स और लिनक्स में आपका स्वागत है! पहली पोस्ट के लिए अच्छी नौकरी। (१) जबकि यह प्रश्न का उत्तर दे सकता है, यह एक बेहतर उत्तर होगा यदि आप यह बता सकते हैं कि यह कैसे / क्यों करता है। साइट के मानक पिछले चार वर्षों में विकसित हुए हैं; जबकि 2011 में कोड-ओनली उत्तर स्वीकार्य थे, अब हम व्यापक उत्तर पसंद करते हैं जो अधिक स्पष्टीकरण और संदर्भ प्रदान करते हैं। मैं आपको पूरी स्क्रिप्ट समझाने के लिए नहीं कह रहा हूं; सिर्फ आपके द्वारा बदले गए भाग (लेकिन यदि आप पूरी स्क्रिप्ट को समझाना चाहते हैं, तो यह ठीक है)। (BTW, मैं इसे ठीक समझता हूं ; मैं अपने कम अनुभवी उपयोगकर्ताओं की ओर से पूछ रहा हूं।) ... (Cont'd)
G-Man

(Cont'd) ... कृपया टिप्पणियों में प्रतिक्रिया न करें; इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें। (2) स्क्रिप्ट को ठीक करना ताकि मेमोरी में पूरे एरे को होल्ड करने की आवश्यकता न हो, यह एक अच्छा सुधार है, लेकिन मुझे यकीन नहीं है कि यह कहना उचित है कि आपका संस्करण "अधिक कुशल" है जब आपके पास तीन अनावश्यक catकमांड हों; देख UUOC । … (Cont'd)
G-Man

(Cont'd)… (3) आपका कोड सुरक्षित है, क्योंकि आप सेट करते हैं FILENAMEऔर आप जानते हैं कि आपने इसे क्या सेट किया है, लेकिन सामान्य तौर पर, आपको हमेशा शेल वेरिएबल्स को उद्धृत करना चाहिए जब तक कि आपके पास कोई अच्छा कारण न हो, और आप सुनिश्चित करें कि आप जानते हैं कि आप क्या कर रहे हैं। (४) आपके उत्तर और ब्रूस के नकारात्मक इनपुट को अनदेखा करना (यानी, शुरुआत के साथ संख्या -); यह सुझाव देने के लिए कि यह सही है या वांछित व्यवहार है, कुछ भी नहीं है। बुरा मत मानो; यह चार साल से अधिक हो गया है, और, जाहिर है, मैं पहला व्यक्ति हूं जिसने ध्यान दिया है।
जी-मैन

सुझावों के अनुसार संपादन किया। डिडेन, टी को कैट कमांड के ओवरहेड के बारे में पता था। हमेशा इसका इस्तेमाल सिंगल फाइल्स को स्ट्रीम करने के लिए किया जाता है। UUOC के बारे में मुझे बताने के लिए धन्यवाद .....
राहुल अग्रवाल

अच्छा। मैंने तीसरे को समाप्त कर दिया catऔर स्पष्टीकरण में जोड़ा।
जी-मैन

2

numएक छोटे से है awkआवरण जो वास्तव में इस और अधिक, जैसे करता है

$ echo "1 2 3 4 5 6 7 8 9" | num max
9
$ echo "1 2 3 4 5 6 7 8 9" | num min max median mean
..and so on

यह आपको अल्ट्रा-पोर्टेबल awk में व्हील को फिर से स्थापित करने से बचाता है। डॉक्स ऊपर दिए गए हैं, और यहां सीधा लिंक ( GitHub पेज भी देखें )।


उपयोगकर्ता कंप्यूटर में निष्पादित किए जाने वाले अस्पष्ट वेब कोड के लिंक मुझे एक बुरे विचार की तरह लगते हैं। जिस साइट में कोड होता है वह यहां रहती है

जहां इस "battletested" कोड पर डाल दिए जाने से पहले आयोजित किया गया GitHub के सभी 4 महीने पहले? मुझे यह बेहद संदेहास्पद लगता है कि जीथब का लिंक कर्ल डाउनलोड कमांड से छीलना है। यह पता लगाना अधिक आसान है कि डेवलपर को वित्तीय रूप से कैसे दान किया जाए। ऐसा लगता है कि उस कोड के लेखक को डर है कि लोग गितुब में जा सकते हैं और (लगभग गैर-मौजूद) इतिहास और आंकड़ों को देख सकते हैं। क्या धन जुटाने की कोशिश के अलावा इस लड़ाई को बिल्कुल भी परीक्षण कहा जा सकता है?
एंथन

@BinaryZeba: अपडेटेड
कोडरफॉस्लेशन

@ एंथन ओके, 'बटुएस्टेड' भाग को हटा दिया। मुझे नहीं लगता कि यह साजिश FUD के लिए जगह है।
कोडरफॉस्लेशन


1

cat/pythonकेवल समाधान - खाली-इनपुट प्रमाण नहीं!

cat data |  python3 -c "import fileinput as FI,statistics as STAT; i = [int(l) for l in FI.input()]; print('min:', min(i), ' max: ', max(i), ' avg: ', STAT.mean(i), ' median: ', STAT.median(i))"

आपने
पीटर.ओ.

@ पीटर। तय।
रवोज्दिला

आँकड़े मॉड्यूल की आवश्यकता है अजगर संस्करण> = 3.4
Peter.O

@ पीटर। आप सही हैं - क्या यह एक समस्या है?
राववज्ज्डीला

यह एक समस्या नहीं है जब तक कि आपके पास उचित अजगर संस्करण नहीं है। यह सिर्फ इसे कम पोर्टेबल बनाता है।
पीटर। 22

0

यदि आप शांत या चतुर होने के बजाय उपयोगिता में अधिक रुचि रखते हैं, तो perlएक आसान विकल्प है awk। द्वारा और बड़े यह लगातार व्यवहार के साथ हर * निक्स पर होगा, और खिड़कियों पर स्थापित करना आसान और मुफ्त है। मुझे लगता है कि यह भी कम से कम गूढ़ है awk, और कुछ आँकड़े मॉड्यूल आप उपयोग कर सकते हैं यदि आप इसे स्वयं लिखने और आर जैसे कुछ के बीच एक आधा घर चाहते थे। मेरा काफी अप्रकाशित (वास्तव में मुझे पता है कि इसमें बग हैं लेकिन यह मेरे उद्देश्यों के लिए काम करता है। ) perlस्क्रिप्ट को लिखने में लगभग एक मिनट का समय लगा, और मुझे लगता है कि केवल एक ही गुप्त भाग होगा while(<>), जो कि बहुत ही उपयोगी शॉर्टहैंड है, जिसका अर्थ है कि कमांड लाइन आर्ग्युमेंट्स के रूप में पास की गई फ़ाइल, एक बार में एक लाइन पढ़ें और डाल दें विशेष चर में वह रेखा$_। तो आप इसे count.pl नामक फ़ाइल में रख सकते हैं और इसे चला सकते हैं perl count.pl myfile। इसके अलावा यह स्पष्ट रूप से स्पष्ट होना चाहिए कि क्या चल रहा है।

$max = 0;
while (<>) {
 $sum = $sum + $_;
 $max = $_ if ($_ > $max);
 $count++;
}
$avg=$sum/$count;
print "$count numbers total=$sum max=$max mean=$avg\n";

3
आपने मीडियन
पीटर

0
function median()
{
    declare -a nums=($(cat))
    printf '%s\n' "${nums[@]}" | sort -n | tail -n $((${#nums[@]} / 2 + 1)) | head -n 1
}  

अगर वहाँ की एक विवरण था इस उत्तर उपयोगी होगा कैसे उपरोक्त कोड सवाल का जवाब, जैसे, आप कहना चाहिए कि यह बैश (नहीं उपयोग कर रहा है sh) दुभाषिए के रूप में। फ़ाइल से सरणी में डेटा कैसे पढ़ा जाता है, इसके साथ एक समस्या भी है।
एंथनी जोगेगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.