এমন কোনও ইউনিক্স কমান্ড রয়েছে যা সর্বনিম্ন / সর্বোচ্চ দুটি সংখ্যা দেয়?


37

আমি পাঠানো সংখ্যার সীমাবদ্ধ করার জন্য একটি আদেশ খুঁজছিলাম stdin

আমি সে উদ্দেশ্যে একটি ছোট স্ক্রিপ্ট লিখেছি (সমালোচনা স্বাগত), তবে আমি ভাবছিলাম যে এটির জন্য সহজ এবং (আমি মনে করি) সাধারণ ব্যবহারের ক্ষেত্রে কোনও মানক কমান্ড নেই কিনা।

আমার স্ক্রিপ্ট যা সর্বনিম্ন দুটি সংখ্যার সন্ধান করে:

#!/bin/bash
# $1 limit

[ -z "$1" ] && { echo "Needs a limit as first argument." >&2; exit 1; }

read number

if [ "$number" -gt "$1" ]; then
        echo "$1"
else
        echo "$number"
fi

উত্তর:


20

আপনি কেবল দুটি সংখ্যার তুলনায় তুলনা করতে dcপারেন:

dc -e "[$1]sM $2d $1<Mp"

... যেখানে "$1"আপনার সর্বোচ্চ মান এবং "$2"এটির চেয়ে কম হলে আপনি যে সংখ্যাটি মুদ্রণ করবেন তা "$1"। এটির জন্যও জিএনইউ দরকার dc- তবে আপনি একই জিনিস পোর্টেবলের মতো করতে পারেন:

dc <<MAX
    [$1]sM $2d $1<Mp
MAX

উপরের দুটি ক্ষেত্রেই আপনি 0 (ডিফল্ট) এর মতো অন্য কিছুতে নির্ভুলতা সেট করতে পারেন ${desired_precision}k। উভয়ের জন্য এটিও জরুরী যে আপনি যাচাই করেছেন যে উভয় মান অবশ্যই সংখ্যার কারণ কল / ডাকে অপারেটর dcকরতে পারে ।system()!

নিম্নলিখিত ছোট স্ক্রিপ্টের সাথে (এবং পরবর্তী)grep -v \!|dc আপনারও ইনপুটটি যাচাই করা উচিত - পছন্দসই বা যথেচ্ছভাবে ইনপুটটি দৃ rob়তার সাথে পরিচালনা করতে কিছু। আপনার এও জানা উচিত যে dcnegativeণাত্মক সংখ্যাকে _উপসর্গের চেয়ে উপসর্গের সাথে ব্যাখ্যা করে -- কারণ পরবর্তীটি বিয়োগফল অপারেটর।

যে ছাড়াও এই স্ক্রিপ্টের সাথে dcপড়তে হবে হিসাবে অনেক অনুক্রমিক \newline সংখ্যার পৃথক হিসাবে আপনি এটা প্রদান যত্ন নেবেন, এবং প্রতিটি হয় আপনার জন্য প্রিন্ট $maxমান বা ইনপুট, যার উপর নির্ভর করে Wo কম হল:

dc -e "${max}sm
       [ z 0=? d lm<M p s0 lTx ]ST
       [ ? z 0!=T q ]S?
       [ s0 lm ]SM lTx"

তাই ... যারা প্রতিটি [বর্গ বন্ধনী করা ]expanses একটি হল dc স্ট্রিং বস্তুর যে Sকোনো একটি - তার নিজ নিজ অ্যারের প্রতিটি aved T, ?অথবা Mস্ট্রিংয়েরdc সাথে কিছু অন্যান্য কাজ করা যেতে পারে , এটি ম্যাক্রো হিসাবেও এটিকে উত্সাহিত করতে পারে । আপনি যদি এটি ঠিকঠাকভাবে সাজান তবে একটি সম্পূর্ণ কার্যকরী ছোট স্ক্রিপ্টটি কেবল যথেষ্ট পরিমাণে একত্রিত হয়।xdc

dcএকটি স্ট্যাক উপর কাজ করে । সমস্ত ইনপুট অবজেক্টগুলি প্রতিটি শেষের দিকে স্ট্যাক করা হয় - প্রতিটি নতুন ইনপুট অবজেক্ট সর্বশেষ শীর্ষ বস্তু এবং তার নীচে সমস্ত বস্তু এক হিসাবে যুক্ত হওয়ার সাথে সাথে স্ট্যাকের নীচে চাপিয়ে দেয়। কোনও বস্তুর সর্বাধিক উল্লেখগুলি শীর্ষ স্ট্যাক মানের সাথে থাকে এবং সর্বাধিক উল্লেখগুলি স্ট্যাকের শীর্ষে পপ হয় (যা নীচে সমস্ত বস্তু একের সাথে টান দেয়)

মূল স্ট্যাকটি ছাড়াও, আরও রয়েছে (কমপক্ষে) 256 অ্যারে এবং প্রতিটি অ্যারের উপাদানটি স্ট্যাকের সাথে সমস্ত নিজস্ব হয়। আমি এখানে খুব বেশি ব্যবহার করি না। আমি উল্লিখিত স্ট্রিংগুলি কেবলমাত্র সংরক্ষণ করি যাতে আমি lযখন চাইতাম তখন সেগুলি ওড করতে পারি এবং শর্তসাপেক্ষে এটিকে উত্সাহিত করতে পারি x, এবং আমি অ্যারের শীর্ষে মানটি sছিঁড়ে ফেলি ।$maxm

যাইহোক, dcআপনার শেল-স্ক্রিপ্টটি কী করে এই মূলত কিছুটা করে। এটি GNU-ism -eবিকল্পটি ব্যবহার করে - dcসাধারণত স্ট্যান্ডার্ড-ইন থেকে এটির পরামিতিগুলি নেয় - তবে আপনি একইভাবে করতে পারেন:

echo "$script" | cat - /dev/tty | dc

... $scriptউপরের বিটের মতো দেখতে যদি ।

এটি এর মতো কাজ করে:

  • lTx- এই lওডস এবং ই xশীর্ষে সঞ্চিত ম্যাক্রোকে এক্সুট করে তোলে T (পরীক্ষার জন্য, আমি অনুমান করি - আমি সাধারণত নামগুলি নির্বিচারে চয়ন করি)
  • z 0=?- Tএরপরে স্ট্যাকের গভীরতা ডাব্লু / zএবং পরীক্ষা করে , যদি স্ট্যাকটি খালি থাকে (পড়ুন: 0 টি অবজেক্ট ধারণ করে) এটি ?ম্যাক্রোকে কল করে ।
  • ? z0!=T q- ?ম্যাক্রোটি ? dcবিল্টিন কমান্ডের জন্য নামকরণ করা হয়েছে যা স্টিডিনের ইনপুটটির একটি লাইন পড়ে, তবে আমি zএটিতে আরও একটি স্ট্যাক গভীরতার পরীক্ষা যুক্ত করেছি, যাতে এটি qফাঁকা লাইনে টানলে বা ইওএফ হিট হলে পুরো ছোট্ট প্রোগ্রামটি তৈরি করতে পারে। তবে যদি এটির !পরিবর্তে এবং সফলভাবে স্ট্যাকটি পপুলেটে না করে তবে এটি Tপুনরায় ইস্টকে কল করে ।
  • d lm<M- Tএরপরে dস্ট্যাকের শীর্ষটি সরানো হবে এবং এর সাথে তুলনা করা হবে $max (সঞ্চিত হিসাবে m) । যদি mকম মান হয় dcতবে Mম্যাক্রোকে কল করুন ।
  • s0 lm- Mকেবল স্ট্যাকের শীর্ষটিকে পপ করে এবং এটিকে ডামি স্কেলারে ফেলে দেয় 0- স্ট্যাকটি পপ করার কেবলমাত্র সস্তা উপায়। এটি lএস্টে mফেরার আগে আবারও ওডস হয় T
  • p- এর অর্থ হ'ল যদি mস্ট্যাকের বর্তমান শীর্ষের চেয়ে কম হয়, তবে mএটি প্রতিস্থাপন করুন ( dযাইহোক যাইহোক, এটির ফলস্বরূপ) এবং এখানে printed হয়, অন্যথায় এটি হয় না এবং pপরিবর্তে ইনপুটটি কীভাবে rinted হয়।
  • s0- এর পরে (কারণ pস্ট্যাকটি পপ করে না) আমরা স্ট্যাকের শীর্ষটি 0আবার dumpুকিয়ে দেই এবং তারপরে ...
  • lTx- পুনরাবৃত্তির সাথে আরও একবার এটিকে আবার lউত্তেজিত করুন ।Tx

সুতরাং আপনি এই ছোট স্নিপেটটি চালাতে এবং ইন্টারেক্টিভভাবে আপনার টার্মিনালে নম্বর টাইপ করতে পারেন এবং আপনি যে নম্বরটি লিখেছিলেন সেটির নামটি dcবা $maxআপনার টাইপ করা সংখ্যাটি আরও বড় হলে আপনার মানটি আবার মুদ্রণ করতে পারে । এটি স্ট্যান্ডার্ড ইনপুট হিসাবে কোনও ফাইল (যেমন একটি পাইপ) গ্রহণ করবে । এটি খালি লাইন বা ইওএফ-এর মুখোমুখি না হওয়া অবধি পড়া / তুলনা / মুদ্রণ লুপটি চালিয়ে যাবে।

যদিও এই সম্পর্কে কিছু নোট - আমি এটি কেবল আপনার শেল ফাংশনটিতে আচরণ অনুকরণ করার জন্য লিখেছি, সুতরাং এটি কেবল দৃ line়তার সাথে প্রতি লাইনে একটি সংখ্যা পরিচালনা করে। dcযাইহোক, প্রতি লাইনে যতগুলি পৃথক পৃথক সংখ্যক হ্যান্ডল করতে পারে আপনি এটি নিক্ষেপ করার যত্ন নেবেন। তবে , লাইনের শেষ সংখ্যাটি স্ট্যাক করার কারণে এটি প্রথম চালিত হয় এবং তাই লিখিত হিসাবে, dcআপনি যদি প্রতি লাইনে প্রতি একাধিক সংখ্যক মুদ্রণ / টাইপ করেন তবে এর ফলাফলটি বিপরীতে মুদ্রণ করবে proper সঠিকভাবে এটি হ্যান্ডেল করা মানে অ্যারেতে একটি লাইন সঞ্চয় করা, তারপরে এটি কাজ করা।

এটার মত:

dc -e "${max}sm
    [ d lm<M la 1+ d sa :a z0!=A ]SA
    [ la d ;ap s0 1- d sa 0!=P ]SP 
    [ ? z 0=q lAx lPx l?x ]S?
    [q]Sq [ s0 lm ]SM 0sa l?x"

তবে ... আমি জানি না যে আমি এটিকে আরও গভীরতার সাথে ব্যাখ্যা করতে চাই কিনা। এটি যথেষ্ট বলুন যে dcস্ট্যাকের প্রতিটি মান হিসাবে এটি পড়ছে এটি তার মূল্য বা $maxএকটি এর সূচকযুক্ত অ্যারেতে এর মান সংরক্ষণ করে এবং এটি যখন স্ট্যাকটি আবার খালি হয় তা সনাক্ত করে, তারপরে এটি অন্য সূচিপত্রকে অন্যটি পড়ার চেষ্টা করার আগে মুদ্রণ করে ইনপুট লাইন।

এবং তাই, প্রথম স্ক্রিপ্টটি যখন ...

10 15 20 25 30    ##my input line
20
20
20
15
10                ##see what I mean?

দ্বিতীয়টি করে:

10 15 20 25 30    ##my input line
10                ##that's better
15
20
20                ##$max is 20 for both examples
20

আপনি যদি kকমান্ডটি দিয়ে প্রথমে সেট করেন তবে আপনি নির্বিচারে নির্ভুলতার ফ্লোটগুলি পরিচালনা করতে পারেন । এবং আপনি স্বাধীনভাবে iএনপুট বা oআউটপুট রেডাইসগুলি পরিবর্তন করতে পারেন - যা কখনও কখনও আপনি আশা নাও করার কারণে কার্যকর হতে পারে। উদাহরণ স্বরূপ:

echo 100000o 10p|dc
 00010

... যা প্রথমে dc100000 এ আউটপুট রেডিক্স সেট করে তারপরে 10 টি প্রিন্ট করে।


3
মাত্র দু'বার পড়ার পরে কী ঘটেছিল তা জানার জন্য +1। এটি জানতে আমার সময় নিতে হবে।
মিনিক্স

@ মিনিক্স - মেহ - আপনি যদি বিভ্রান্তি মনে করেন তবে প্রাচীনতম ইউনিক্স প্রোগ্রামিং ভাষাটির সন্ধান করতে হবে না। dcযদিও এটি এর পায়ের আঙ্গুলের উপরে রাখার জন্য একবারে একবারে কয়েকটি সংখ্যা কেবল পাইপ করুন।
মাইকজার্ভ

1
@ মিমিকার্ভ আমার জন্য অনেক দেরী হয়ে গেছে। আমি আশা করি ভবিষ্যত প্রজন্ম আমাকে সাবধানতার কাহিনী হিসাবে গ্রহণ করবে। স্কয়ার বন্ধনী এবং সর্বত্র চিঠিগুলি ...
মিনিক্স

@ মিনিক্স - আপনার অর্থ কী? আপনি এটি জন্য গিয়েছিলাম? খুব ভাল - dcএকটি চঞ্চল জন্তু, তবে এটি কোনও ইউনিক্স সিস্টেমে সবচেয়ে দ্রুত এবং সবচেয়ে অদ্ভুতভাবে সক্ষম সাধারণ ইউটিলিটি হতে পারে। জোড় করা যখন ডাব্লু / sedএটি কিছু অসাধারণ কাজ করতে পারে। আমি এটি নিয়ে খেলছিলাম এবং ddইদানীং যাতে আমি যে একত্ববাদ প্রতিস্থাপন করতে পারে readline। আমি কিছু কাজ করছি তার একটি ছোট নমুনা এখানে । একটি এরকম revমধ্যে dcপ্রায় সন্তানের খেলা।
মাইকজার্ভ

1
@ মিনিক্স - যদিও সাবধানে ডাব্লু / বন্ধনীগুলি। স্ট্রিংয়ের মধ্যে বর্গাকার বন্ধনী রাখার কোনও উপায় নেই - আপনি সবচেয়ে ভাল করতে পারেন [string]P91P93P[string]P। সুতরাং আপনার এই সামান্য বিটটি আমার কাছে sedদরকারী বলে মনে হতে পারে: sed 's/[][]/]P93]&[1P[/g;s/[]3][]][[][1[]//g'যা সর্বদা স্কোয়ারগুলি সঠিকভাবে স্ট্রিং ক্লোস ব্র্যাকেটের সাথে প্রতিস্থাপন করা উচিত, তারপরে একটি P, তার পরে বর্গের দশমিক এ্যাসিআই মান এবং অন্যটি P; তারপরে [স্ট্রিং চালিয়ে যাওয়ার জন্য একটি উন্মুক্ত বর্গাকার বন্ধনী। ডান্নো যদি আপনি ডাব্লু / dcএর স্ট্রিং / সংখ্যাসূচক রূপান্তর ক্ষমতাটি ঘিরে ফেলে থাকেন তবে - বিশেষত যখন ডাব্লু / এর সাথে একত্রিত হন od- এটি বেশ মজাদার হতে পারে।
মাইকজার্ভ

88

আপনি যদি জানেন যে আপনি দুটি পূর্ণসংখ্যার সাথে কাজ করছেন aএবং b, তবে এই সাধারণ শেল পাটিগণিত সম্প্রসারণটি টার্নারি অপারেটরটি ব্যবহার করে সংখ্যাসূচক সর্বোচ্চ দিতে যথেষ্ট:

$(( a > b ? a : b ))

এবং সংখ্যাগত মিনিট:

$(( a < b ? a : b ))

যেমন

$ a=10
$ b=20
$ max=$(( a > b ? a : b ))
$ min=$(( a < b ? a : b ))
$ echo $max
20
$ echo $min
10
$ a=30
$ max=$(( a > b ? a : b ))
$ min=$(( a < b ? a : b ))
$ echo $max
30
$ echo $min
20
$ 

এখানে এটি প্রদর্শন করে একটি শেল স্ক্রিপ্ট:

#!/usr/bin/env bash
[ -z "$1" ] && { echo "Needs a limit as first argument." >&2; exit 1; }
read number
echo Min: $(( $number  < $1 ? $number : $1 ))
echo Max: $(( $number  > $1 ? $number : $1 ))

চমৎকার উত্তর. দয়া করে, একটি ছোটখাটো মোড: এটি কি "> =" জন্য ব্যবহার করা যেতে পারে?
সোপালাজো ডি অ্যারিরেজ

@ সোপালাজোড অ্যারিয়েরেজ আপনি কী বলতে চাইছেন তা আমি পুরোপুরি নিশ্চিত নই। আপনিও করতে পারেন max=$(( a >= b ? a : b )), তবে ফলাফল সম্পূর্ণরূপে এক - যদি a এবং b সমান হয়, তবে কোনটি প্রত্যাবর্তন করা হবে তা আসলে ব্যাপার নয়। তুমি কি তাই জিজ্ঞাসা করছ?
ডিজিটাল ট্রমা

সত্যই, আপনাকে ধন্যবাদ, ডিজিটাল ট্রমা। আমি কেবল ভাবছিলাম যে এখানে বুলিয়ান অপারেটর "> =" সম্ভব কিনা।
সোপালাজো ডি অ্যারিরেজ

@ সোপালাজোডে আরিরিজেজ if (( a >= b )); then echo a is greater than or equal to b; fi- আপনি যা চাইছেন তা কি? ( (( ))পরিবর্তে এখানে ব্যবহারের নোট দিন $(( )))
ডিজিটাল ট্রমা

আহ, হ্যাঁ, ঠিক আছে। আমি এখন বুঝতে পেরেছি. শেল প্রসারণ সম্পর্কে আমি বেশি কিছু জানি না, তাই আমি সাধারণত শর্তগুলির মধ্যে বিভ্রান্ত হয়ে যাই। আপনাকে আবার ধন্যবাদ।
সোপালাজো ডি অ্যারিরেজ

25

sortএবং এটি headকরতে পারেন:

numbers=(1 4 3 5 7 1 10 21 8)
printf "%d\n" "${numbers[@]}" | sort -rn | head -1       # => 21

2
নোট করুন যে এটি O(n log(n))যখন সর্বাধিকের কার্যকর বাস্তবায়ন হবে O(n)। এটি আমাদের সামান্য তাত্পর্য n=2যদিও, দুটি প্রক্রিয়া spawning অনেক বড় ওভারহেড হয়।
মিথ্যা রায়ান

1
@ গ্লেন-জ্যাকম্যান সত্য হলেও, আমি নিশ্চিত নই যে এটি প্রশ্নের উত্তর দিয়েছিল। এটি করার সবচেয়ে দক্ষ উপায়টির জন্য কোনও অনুরোধ ছিল না। আমি মনে করি প্রশ্নটি সুবিধার্থে আরও ছিল।
ডেভিড হোলজার

1
@ ডেভিডহোলজার - এখানে দেওয়া উত্তরের মধ্যে এমনকি এটি করার পক্ষে এটি সবচেয়ে কার্যকর উপায় নয়। যদি সংখ্যা সেট নিয়ে কাজ করা হয় তবে এখানে কমপক্ষে আরও একটি উত্তর রয়েছে যা এটির চেয়ে আরও দক্ষ (প্রস্থের আদেশ অনুসারে) , এবং কেবলমাত্র দুটি পূর্ণসংখ্যার সাথে কাজ করলে তার চেয়ে আরও কার্যকর এখানে উত্তর দেওয়া হবে (প্রস্থের আদেশ অনুসারে) । যদিও এটি সুবিধাজনক (তবে আমি ব্যক্তিগতভাবে শেল অ্যারেটি ছেড়ে দিতে চাই)
মাইক্রজারভ

1
নিম্নলিখিত হিসাবে অ্যারে ছাড়াই এটি করা যেতে পারে:numbers="1 4 3 5 7 1 10 21 8"; echo $numbers | tr ' ' "\n" | sort -rn | head -n 1
ngreen

1
আরো দক্ষ পদ্ধতির সম্ভবত এই যে,max=0; for x in $numbers ; do test $x -gt $max && max=$x ; done
ngreen

6

আপনি পূর্বনির্ধারিত গণিত ফাংশনগুলির একটি গ্রন্থাগার নির্ধারণ করতে পারেন bcএবং তারপরে কমান্ড লাইনে তাদের ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, কোনও পাঠ্য ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন ~/MyExtensions.bc:

define max(a,b){
  if(a>b)
  { 
   return(a)
  }else{
   return(b)
  }
}

এখন আপনি কল করতে পারেন bc:

> echo 'max(60,54)' | bc ~/MyExtensions.bc
60

অবগতির জন্য, সেখানে বিনামূল্যে গণিত লাইব্রেরি ফাংশন হয় যেমন এই হিসাবে অনলাইন উপলব্ধ।

এই ফাইলটি ব্যবহার করে, আপনি সহজেই আরও জটিল ফাংশনগুলি গণনা করতে পারেন যেমন GCD:

> echo 'gcd (60,54)' | bc ~/extensions.bc -l
6

যদি আমি ভুল না হয়ে থাকি তবে এ জাতীয় ফাংশন প্রয়োজনে এক্সিকিউটেবলের সাথেও সংকলন করা যেতে পারে। আমি মনে করি বেশিরভাগ bcগুলি এই দিনটির কেবলমাত্র dcসীমানা , যদিও, জিএনইউbc আর না থাকলেও (তবে জিএনইউ dcএবং জিএনইউ bcতাদের কোডবেসের একটি বিচিত্র পরিমাণ ভাগ করে নিয়েছে) । যাইহোক, এটি এখানে সেরা উত্তর হতে পারে।
মাইকজার্ভ

শেল স্ক্রিপ্টের ফাইলে সুবিধামত এটিকে কল করতে আপনি bcফাংশন কলের ঠিক আগে, ফাংশন সংজ্ঞায় পাইপ করতে পারেন । এরপরে আর দ্বিতীয় ফাইলের দরকার নেই :)
তানিয়াস

5

একটি মন্তব্যের জন্য খুব দীর্ঘ:

এইসব জিনিস দিয়ে যেমন কি করতে পারেন যদিও sort | headবা sort | tailcombos,, বরং এটা উভয় resource- এবং ত্রুটি-হ্যান্ডলিং ভিত্তিক suboptimal মনে। মৃত্যুদন্ড কার্যকর করার জন্য, কম্বো মানে কেবল দুটি লাইন পরীক্ষা করার জন্য 2 টি প্রক্রিয়া তৈরি করা। এটি একটি ওভারকিল কিছুটা বলে মনে হচ্ছে।

আরও গুরুতর সমস্যাটি হ'ল, বেশিরভাগ ক্ষেত্রে আপনার জানা থাকা দরকার যে ইনপুটটি বুদ্ধিমান, এটিতে কেবল সংখ্যা রয়েছে। @ গ্লেনজ্যাকম্যানের সমাধান চতুরতার সাথে সমাধান করে, যেহেতু printf %dঅ-পূর্ণসংখ্যার উপর বাধা দেওয়া উচিত। এটি ভাসমানগুলির সাথেও কাজ করবে না (যদি না আপনি ফর্ম্যাট স্পেসিফায়ার পরিবর্তন করেন তবে আপনি %fযেখানে গোলাকার সমস্যাগুলিতে চলে যাবেন)।

test $1 -gt $2 তুলনা ব্যর্থ হয়েছে কি না তা আপনাকে ইঙ্গিত দেবে (2 এর প্রস্থান স্থিতি মানে পরীক্ষার সময় কোনও ত্রুটি হয়েছিল Since যেহেতু এটি সাধারণত শেলটি অন্তর্নির্মিত হয় তাই কোনও অতিরিক্ত প্রক্রিয়া থাকে না - আমরা কয়েকশ ক্রমের কথা বলছি) গতিময় দ্রুত কার্যকরকরণ only কেবলমাত্র পূর্ণসংখ্যার সাথে কাজ করে।

আপনার যদি কয়েকটি ভাসমান পয়েন্ট সংখ্যার তুলনা করার প্রয়োজন হয় তবে আকর্ষণীয় বিকল্পটি হতে পারে bc:

define x(a, b) {
    if (a > b) {
       return (a);
    }
    return (b);
 }

সমান হতে পারে test $1 -gt $2, এবং শেল ব্যবহার করে:

max () { printf '
    define x(a, b) {
        if (a > b) {
           return (a);
        }
        return (b);
     }
     x(%s, %s)
    ' $1 $2 | bc -l
}

printf | sort | head(দুই সংখ্যার জন্য) থেকে এখনও প্রায় 2.5 গুণ বেশি গতিযুক্ত ।

আপনি যদি জিএনইউ এক্সটেনশনের উপর নির্ভর করতে পারেন তবে আপনি সরাসরি ক্রমান্বয়ে নম্বরগুলি পড়তে ফাংশনটিও bcব্যবহার read()করতে পারেন bc


আমার ধারণা ঠিক - আমি এটিকে কেবল আয়রন করছিলাম, তবে আপনি আমাকে এতে মারধর করেছেন: dc -e "${max}sm[z0=?dlm<Mps0lTx]ST[?z0!=Tq]S?[s0lm]SMlTx"- ওহ, dcপুরো জিনিসটি বাদ দিলে (প্রতিধ্বনিকে বাদ দিয়ে , যদিও এটি পারে) - এটি স্টিডিন পড়ে এবং উভয়ই $maxইনপুট নম্বর প্রিন্ট করে যার উপর নির্ভর করে আরও ছোট যাইহোক, আমি সত্যিই এটি ব্যাখ্যা করার যত্ন নিচ্ছি না এবং আপনার উত্তরটি আমার লেখার চেয়ে ভাল। দয়া করে আমার উপভোগ করুন।
মাইকজার্ভ

@ মাইক্রোজার আসলে একটি বর্ণিত dcস্ক্রিপ্ট থাকা খুব সুন্দর হবে, আরপিএন আজকাল প্রায়ই দেখা যায় না।
পিটার্ফ

বিপরীত পোলিশ স্বরলিপি (ওরফে পোস্টফিক্স স্বরলিপি)। প্লাস যদি dcনিজেই I / O করতে পারে তবে এটি এর চেয়ে আরও মার্জিত হবে।
পিটার্ফ

4

$ A এবং $ b এর বৃহত্তর মান পেতে এটি ব্যবহার করুন:

[ "$a" -gt "$b" ] && $a || $b

তবে এর আশেপাশে আপনার কিছু দরকার, আপনি সম্ভবত সংখ্যাটি কার্যকর করতে চান না, তাই দুটি ব্যবহারের বৃহত্তর মান প্রদর্শন করতে "ইকো"

[ "$a" -gt "$b" ] && echo $a || echo $b

উপরেরগুলি শেল ফাংশনটিতে দুর্দান্তভাবে ফিট করে, যেমন

max() {
   [ "$1" -gt "$2" ] && echo $1 || echo $2
}

দুটির বৃহত্তরকে ভেরিয়েবলের জন্য নির্ধারণ করতে, এই পরিবর্তিত সংস্করণটি ব্যবহার করুন:

[ "$a" -gt "$b" ] && biggest=$a || biggest=$b

বা সংজ্ঞায়িত ফাংশনটি ব্যবহার করুন:

biggest=$( max $a $b )

ফাংশনটির প্রকরণটি আপনাকে সুন্দরভাবে পরীক্ষা করে ইনপুট ত্রুটি যুক্ত করার সুযোগ দেয়।

সর্বোচ্চ দুটি দশমিক / ভাসমান পয়েন্ট নম্বর আপনি ব্যবহার করতে পারেন তা ফিরিয়ে দিতে awk

decimalmax() { 
   echo $1 $2 | awk '{if ($1 > $2) {print $1} else {print $2}}'; 
}

সম্পাদনা করুন: এই কৌশলটি ব্যবহার করে আপনি একটি "সীমাবদ্ধ" ফাংশন তৈরি করতে পারেন যা আপনার সম্পাদনা / নোট অনুযায়ী অন্যভাবে পরিচালনা করে। এই ফাংশনটি দুটির নীচে ফিরে আসবে, যেমন:

limit() {
   [ "$1" -gt "$2" ] && echo $2 || echo $1
}

আমি ইউটিলিটি ফাংশনগুলিকে একটি পৃথক ফাইলে রাখতে চাইছি, এটিকে কল করতে myprogram.funcsএবং এটি কোনও স্ক্রিপ্টে নিম্নলিখিত হিসাবে ব্যবহার করতে চাই:

#!/bin/bash

# Initialization. Read in the utility functions
. ./myprogram.funcs

# Do stuff here
#
[ -z "$1" ] && { echo "Needs a limit as first argument." >&2; exit 1; }

read number
echo $( limit $1 $number )

FWIW এটি এখনও আপনার কাজটি করে এবং আপনার সংস্করণটি আরও ভার্বোস হলেও ঠিক তত দক্ষ।

আরও কমপ্যাক্ট ফর্মটি সত্যিই ভাল নয়, তবে আপনার স্ক্রিপ্টগুলিতে বিশৃঙ্খলা রোধ করে। আপনার যদি অনেকগুলি সাধারণ থাকে তবে-অন্যথায়-ফাইটি স্ক্রিপ্টটি দ্রুত প্রসারণ করে।

আপনি যদি একক স্ক্রিপ্টে একাধিকবার বড় / ছোট সংখ্যার জন্য চেকটি পুনরায় ব্যবহার করতে চান তবে এটি একটি ফাংশনে রাখুন। ফাংশন ফর্ম্যাটটি ডিবাগ এবং পুনরায় ব্যবহার করা সহজ করে তোলে এবং আপনাকে সহজেই স্ক্রিপ্টের সেই অংশটি প্রতিস্থাপন করতে দেয়, উদাহরণস্বরূপ একটি অ্যাড্ক কমান্ডের সাহায্যে নন-ইন্টিজার দশমিক সংখ্যা হ্যান্ডেল করতে সক্ষম হয়।

এটি যদি একক ব্যবহারের ক্ষেত্রে হয় তবে কেবল অনলাইনে কোড করুন।


4

আপনি হিসাবে একটি ফাংশন সংজ্ঞায়িত করতে পারেন

maxnum(){
    if [ $2 -gt $1 ]
    then
        echo $2
    else
        echo $1
    fi
}

এটি হিসাবে কল করুন maxnum 54 42এবং এটি প্রতিধ্বনিত 54। আপনি চাইলে ফাংশনের অভ্যন্তরে বৈধতার তথ্য যুক্ত করতে পারেন (যেমন দুটি আর্গুমেন্ট বা যুক্তি হিসাবে সংখ্যা) like


বেশিরভাগ শেলগুলি ভাসমান পয়েন্ট গণিতগুলি করে না। তবে এটি পূর্ণসংখ্যার জন্য কাজ করে।
orion

1
এই ফাংশনটি অযথা পসিক্স-বেমানান। এতে পরিবর্তন function maxnum {করুন maxnum() {এবং এটি আরও অনেক শেলের জন্য কাজ করবে।
চার্লস ডাফি

2

শেল স্ক্রিপ্ট থেকে, কোনও জাভা পাবলিক স্ট্যাটিক পদ্ধতি (এবং উদাহরণস্বরূপ ম্যাথ.মিন () ) ব্যবহার করার উপায় রয়েছে । লিনাক্সে বাশ থেকে:

. jsbInit
jsbStart 
A=2 
B=3 
C=$(jsb Math.min "$A" "$B")
echo "$C"

এটির জন্য জাভা শেল ব্রিজ https://sourceforge.net/projects/jsbridge/ প্রয়োজন

খুব দ্রুত, কারণ পদ্ধতি কলগুলি অভ্যন্তরীণভাবে পাইপযুক্ত ; কোন প্রক্রিয়া প্রয়োজন।


0

বেশিরভাগ লোক কেবল sort -n input | head -n1(বা লেজ) করতেন, বেশিরভাগ স্ক্রিপ্টিং পরিস্থিতিতে এটি যথেষ্ট ভাল। তবে, আপনার যদি কলামের পরিবর্তে কোনও লাইনে নম্বর থাকে তবে এটি কিছুটা আনাড়ি - আপনাকে এটি সঠিক বিন্যাসে ( tr ' ' '\n'বা অনুরূপ কিছু) মুদ্রণ করতে হবে ।

শেলগুলি সংখ্যাসূচক প্রসেসিংয়ের জন্য একেবারে আদর্শ নয় তবে আপনি সহজেই অন্য কোনও প্রোগ্রামে কেবল পাইপ করতে পারেন যা এতে আরও ভাল। আপনার নিজের পছন্দের উপর নির্ভর করে আপনি সর্বাধিক কল করুন dc(কিছুটা উদ্বিগ্ন, তবে আপনি কী করছেন তা যদি জেনে থাকেন তবে তা ঠিক আছে - মাইক্রোজারের উত্তর দেখুন), বা awk 'NR==1{max=$1} {if($1>max){max=$1}} END { print max }'। বা সম্ভবত perlবা pythonআপনি যদি পছন্দ করেন। একটি সমাধান (আপনি যদি কম পরিচিত সফ্টওয়্যার ইনস্টল করতে এবং ব্যবহার করতে ইচ্ছুক হন) তবে তা হবে ised(বিশেষত যদি আপনার ডেটা একক লাইনে থাকে: আপনাকে কেবল এটি করতে হবে ised --l input.dat 'max$1')।


যেহেতু আপনি দুটি সংখ্যার জন্য জিজ্ঞাসা করছেন, এটি সবই ওভারকিল। এটি যথেষ্ট হতে হবে:

python -c "print(max($j,$k))"

1
ভালো হতে পারে আপনি ব্যবহার sys.argv:python2 -c 'import sys; print (max(sys.argv))' "$@"
muru

1
যে আর্গুমেন্টগুলি sort + headওভারকিল হয় তবে pythonতা গণনা করে না।
মাইক্রজারভ

লাইনের উপরে থাকা সমস্ত পদ্ধতিগুলি বিশাল সংখ্যক সেট পরিচালনা করতে এবং এই ধরণের ব্যবহারের জন্য স্পষ্টভাবে পরামর্শ দেয় (পাইপ বা কোনও ফাইল থেকে পড়া)। 2 টি আর্গুমেন্টের জন্য সর্বনিম্ন / সর্বোচ্চ হ'ল এমন একটি প্রশ্ন যা আলাদাভাবে অনুভব করে - এটি একটি স্ট্রিমের পরিবর্তে কোনও ফাংশনের জন্য কল করে। আমি স্রেফ বোঝাতে চেয়েছি যে স্ট্রিমের পন্থা অত্যধিক কিল - আপনি যে সরঞ্জামটি ব্যবহার করছেন তা নির্বিচারে, আমি কেবল ব্যবহার করেছি pythonকারণ এটি পরিষ্কার।
প্রাচ্য

আমি এই প্রস্তাবিত সমাধানটিকে আরও নিকৃষ্ট বলব , তবে এটি হতে পারে কারণ আমি pythonধর্মাবলম্বী (বা কারণ এটির জন্য কাঁটাচামচ এবং অতিরিক্ত দৈত্যিক অনুবাদক প্রয়োজন হয় না) । অথবা উভয় হতে পারে।
মাইকজার্ভ

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