আমি কীভাবে একটি স্ট্রিংয়ের মধ্যে দীর্ঘতম সংখ্যা মুদ্রণ করতে পারি?


11

আমি একটি স্ট্রিংয়ের মধ্যে দীর্ঘতম সংখ্যা মুদ্রণের জন্য একটি পদ্ধতি খুঁজছি।

যেমন: আমার যদি স্ট্রিং থাকে

212334123434test233

আমি কীভাবে মুদ্রণ করতে পারি

212334123434

?

দ্রষ্টব্য: আমি সংখ্যার দীর্ঘতম ক্রমাগত ক্রম খুঁজছি, সংখ্যাগতভাবে উচ্চতর মানের জন্য নয়।


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


একাধিক সমান দীর্ঘ ক্রমাগত ধারাবাহিকতা থাকলে আপনি পদ্ধতিটি কী করতে চান? প্রথমটি নাও? গত? এলোমেলো এক?
অ্যান্থন

@ আনহন হু, আমি এটা ভাবিনি। ভাগ্যক্রমে যথেষ্ট যে এটি আমার নির্দিষ্ট ক্ষেত্রে সমস্যা নয়। আমি অনুমান করি যে কোনও বিকল্প ভাল থাকবে।
গ্লুটোনিমেট

3
লক্ষ্য করুন উত্তর আপনাকে স্বীকার করেছে (এবং অন্য সকলে এতদূর ছাড়া এক ) দশমিক সংখ্যার সাথে মোকাবিলা করা হবে না। আপনার জন্য যদি সমস্যা হয় তবে আমি জানি না।
terdon

@ এটারডন: এটি আমার নির্দিষ্ট ক্ষেত্রে কোনও সমস্যা নয় কারণ আমি আসল সংখ্যার চেয়ে আইডি নিয়ে কাজ করছি তবে তবুও আপনার উত্তরটির জন্য আপনাকে ধন্যবাদ জানাতে চাই! আমি নিশ্চিত যে ভবিষ্যতে অন্য কেউ এটিকে খুব দরকারী বলে মনে করবেন।
গ্লুটানীমেট

আপনি কি সমাধানটি নেতিবাচক সংখ্যাগুলি মোকাবেলা করতে সক্ষম হতে চান? এবং যদি তাই হয় - বিয়োগ চিহ্নটি দৈর্ঘ্যের দিকে গণনা করে?
ফ্লোরিস

উত্তর:



13

আমি তোমাদের শুধু সঙ্গে এই কাজ করতে পারেন বিশ্বাস grep, sortএবং tailহিসাবে ভাল। এখানে কিছু উদাহরণ স্ট্রিং।

$ echo <str> | grep -oP "\d+" | sort -n | tail -1

<str>প্রশ্নে আমাদের স্ট্রিং কোথায় ।

উদাহরণ

$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc

এখন যদি আমি আমার grep ...কমান্ডের মাধ্যমে ঘুরে দেখি ।

$ echo $str0 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str1 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str2 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str3 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str4 | grep -oP "\d+" | sort -n | tail -1
212334123434

এই পদ্ধতির সমস্ত সাবস্ট্রিংগুলি সংখ্যার ক্রমগুলি বেছে নিয়ে কাজ করে। তারপরে আমরা এই আউটপুটটিকে সংখ্যাগতভাবে বাছাই করব sort -nএবং তারপরে ব্যবহার করে তালিকার শেষ মানটি ধরব tail -1। এটি দীর্ঘতম স্ট্রস্ট্রিং হবে।

আপনি tail -1উদাহরণগুলির মধ্যে একটি পুনরায় চালু করে এটি কীভাবে কাজ করে তা দেখতে পারেন :

$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434

জিরো দিয়ে শুরু হওয়া স্ট্রিংগুলি

উপরোক্ত পদ্ধতির প্রতিটা পরিস্থিতিতে আমি একটিকে বাদ দিয়ে কল্পনা করতে পারি for @ স্টারডন এই দৃশ্যের চ্যাটে উল্লেখ করেছেন যা উপরের পদ্ধতির ব্যর্থ করে।

  • 0000000000001
  • 2

সুতরাং এটি মোকাবেলা করতে আপনার কৌশলগুলি কিছুটা পরিবর্তন করতে হবে। উপরোক্ত পদ্ধতির কার্নেলটি এখনও লাভারেজ করা যায়, তবে ফলাফলগুলিতে আমাদের অক্ষরের সংখ্যাও ইনজেক্ট করা দরকার। এটি স্ট্রিং এবং তার মানগুলিতে অক্ষরের সংখ্যা অনুসারে ফলাফলকে বাছাই করার ক্ষমতা প্রদান করে।

$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
    echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2

ফলাফল:

$ echo $str0
0000000000001a2test

$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
    echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
0000000000001

আপনি ভেরিয়েবলের দৈর্ঘ্য নির্ধারণের জন্য বাশের ক্ষমতাকে কাজে লাগিয়ে কিছুটা ঘনীভূত করতে পারেন ${#var}

$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
    sort -n | tail -1 | cut -d" " -f2
0000000000001

P গ্রেপ -পি ব্যবহার করে

আমি grep -P ...উপরের ব্যবহারটি বেছে নিয়েছি কারণ আমি, পার্ল বিকাশকারী হয়ে, সমস্ত সংখ্যার মতো ক্লাস সিনট্যাক্সের মতো: \d+পরিবর্তে [[:digit:]]\+বা এর পরিবর্তে [0-9]\+। তবে এই বিশেষ সমস্যার জন্য এটি সত্যই প্রয়োজন হয় না। আপনি যেমনটি grepআমি ব্যবহার করেছি ঠিক তেমন সহজেই তা মুছতে পারে:

$ .... grep -o "[0-9]\+" ....

উদাহরণ স্বরূপ:

$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
    sort -n | tail -1 | cut -d" " -f2
0000000000001

2
ব্যবহার ${#i}স্ট্রিং দৈর্ঘ্য পেতে আপনাকে কল সংরক্ষণ করতে পারবেন wc, যদি আপনি যেতে ব্যাশ-নির্দিষ্ট চান
গ্লেন জ্যাকম্যান

@glennjackman - ধন্যবাদ আমার একজন 8-) এর উন্নতি যোগ
SLM

জিএনইউ গ্রেপ ২.১16 (কমপক্ষে) বলেছেন -পি "অত্যন্ত পরীক্ষামূলক"। আপনি এর grep -o "[0-9]\+"পরিবর্তেgrep -oP "\d+"
ডেভিড কনরাড

1
@ ডেভিডকনরড - এ-তেও এই বিবরণ যুক্ত করেছেন, ধন্যবাদ!
SLM

8

এর মধ্যে একটি সমাধান perl:

echo 212334123434test233abc44 |
perl -nle 'print ((
    map { $_->[0] }
    sort{ $a->[1] <=> $b->[1] }
    map { [$_,length] }
    split /\D+/, $_)[-1]
    )'
212334123434

তথ্যসূত্র


2
একটি সুন্দর শোয়ার্জিয়ান ট্রান্সফর্ম ভালবাসা!
গ্লেন জ্যাকম্যান

7

কমান্ডলাইনে স্ট্রিং দিয়ে অজগর ব্যবহার করে এবং ধরে নেওয়া যে আপনি সর্বোচ্চ দৈর্ঘ্যের প্রথম ক্রমটি চান:

import sys

longest = current = ""
for x in sys.argv[1]:
    if current and not x.isdigit():
        if len(current) > len(longest):
            longest = current
        current = ""
    else:
        current += x 
print(longest)

2
বা python -c "import re,sys; print max(re.split(r'\D+', sys.argv[1]), key=len)"
নিখরচায়

7

দশমিকের পাশাপাশি পূর্ণসংখ্যার সাথেও ডিল করতে পারে এমন আরও একটি পার্ল পদ্ধতির এখানে রয়েছে:

echo "0.212334123434test233" | 
 perl -lne 'while(/([\d.]+)/g){$max=$1 if length($1) > length($max)} print $max'

নোট করুন যে এখন পর্যন্ত পোস্ট করা উত্তরগুলির কোনও দশমিকের সাথে কাজ করবে না এবং যেহেতু আপনি উল্লেখ করেছেন যে আপনি দীর্ঘতম এবং সংখ্যাগতভাবে বৃহত্তম সংখ্যাটি চান না, তাই আমি ধরে নিচ্ছি যে আপনার আসলে দশমিকের প্রয়োজন

ব্যাখ্যা

  • perl -lne: এর -nঅর্থ "ইনপুট লাইনটি লাইনে পড়ুন এবং এতে প্রদত্ত স্ক্রিপ্টটি চালান -e"। -lপ্রতিটি একটি newline যোগ printকল (এবং অন্যান্য জিনিস এখানে প্রাসঙ্গিক নয়)।
  • while(/([\d.]+)/g): বারবার সব সংখ্যা (মাধ্যমে \dমানে [0-9], তাই [\d.]সংখ্যার ম্যাচ হবে এবং .আপনার কাছে ঋণাত্মক সংখ্যা এটি, যোগ করতে পারেন। -প্রথম বন্ধনী মিলেছে স্ট্রিং ক্যাপচার হিসাবে। $1যা পরবর্তী ধাপে ব্যবহার করা হয়।
  • $max=$1 if length($1) > length($max): বর্তমান ম্যাচের দৈর্ঘ্য যদি এখন পর্যন্ত দীর্ঘতমের চেয়ে বেশি হয় ( $max) ম্যাচটি সংরক্ষণ করুন $max
  • print $max: প্রাপ্ত সংখ্যার দীর্ঘতম স্ট্রিং মুদ্রণ করুন। লুপ শেষ হওয়ার পরে এটি কার্যকর করা হবে , সুতরাং সমস্ত সংখ্যা সন্ধান করার পরে।

1
যদিও আপনার রেজেক্স কিছুটা জেনেরিক। এটি উদাহরণস্বরূপ আইপি ঠিকানার সাথে মেলে। আমি \D(\d+(?:\.\d+)?)\Dপরিবর্তে মত কিছু প্রস্তাব ।
জোসেফ আর।

\Dঅ্যাঙ্কর ছাড়াও কাজ করা উচিত ...
জোসেফ আর

@JosephR। হুম, সত্য, আমি .আইপি অ্যাড্রেসের মতো ধারাবাহিকভাবে বিবেচনা করি নি ।
terdon

6

প্রদত্ত

str="212334123434test233"

তারপর বাশ

max=""
while read num; do 
  (( ${#num} > ${#max} )) && max=$num
done < <(grep -Eo '[0-9]+' <<< "$str")
echo $max
212334123434

গ্রেপের জায়গায় স্ট্রয়েটে অ-অঙ্কের অক্ষরগুলিকে প্রতিস্থাপন করে একটি অ্যারে ব্যবহার করে একটি সম্ভবত বিশুদ্ধ বাশ সমাধান

max=""
declare -a nums="${str//[^[:digit:]]/ }"
for num in ${nums[@]}; do 
  (( ${#num} > ${#max} )) && max=$num
done
echo $max

4

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

echo 1111askdlfm2234 |  printf %s\\n $(tr -sc 0-9 \ ) | sort -n | tail -1

এটি আসলে কাজ করে - আমার হয়নি। আমি ভুল দিকে '\ r' ছিল! আমি এটি মুছে ফেলছি। আপনি কেবল শেলটি ব্যবহার করতে পারেন -set -- $(echo $str | tr ... ) ; b=${#1} ; for d ; do [ ${#d} -gt $b ] && b=${#d} n=$d ; done ; echo $n
মাইকসার্ভ

1
আমি আমার নিজের ভয়ঙ্কর পোস্টটি মুছে ফেলেছি এবং আপনি আমার সাথে যথেষ্ট পরিমাণে নম্রভাবে व्यवहार করেছেন। যেহেতু আপনি ইতিমধ্যে trযেকোন উপায়ে ব্যবহার করছেন , আপনি যদি উপরের অংশটি অন্তর্ভুক্ত করেন তবে আমি কোনও উদ্বেগ সহ্য করব না। সম্ভবত sort দ্রুততর, তবে, আবার এটি স্ট্রিমের সমাপ্তির অপেক্ষায় রয়েছে $(subshell)। আমি জানি না। যাইহোক, আপনার ইতিমধ্যে একটি দুর্দান্ত উত্তর, তবে আপনি যদি উপরের শেল লুপটিতে যুক্ত মনে করেন তবে নিঃসঙ্কোচে বলছি সবই আমি বলছি। এবং যাইহোক - এটি সম্ভব এবং আপনি sortকিছুটা সৃজনশীল পরিচালনা wc -Lএবং teeপ্রবাহে সম্পূর্ণরূপে ছাড়াই করতে পারতেন ... যদিও এই প্রশ্নটি দিয়ে এসেছি - আমি বিব্রত।
মাইকজার্ভ

যদিও একটি শেষ জিনিস - আপনি পাশাপাশি trসাবশেলটি থেকে বেরিয়ে আসতে পারেন এবং এ থেকে মুক্তি পেতে পারেন printf। শুধু কর '0-9' '\n'
মাইকসার্ভ

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

2

বাশ এবং জিএনইউ সাজান

IFS=$'\0' read -r l _ < <(tr -cs '[:digit:]' '[\0*]' <<<'11abcde1234556ghijk22'| sort -znr)
echo $l
1234556

2

স্ট্রিংকে বিভক্ত করতে অ-সংখ্যাসূচক অক্ষর ব্যবহার করুন এবং দীর্ঘতম ক্রম বা একটি বৃহত সংখ্যার মান (সমান দৈর্ঘ্যের সংখ্যার জন্য) একটি চৌম্বক অপারেটরের সাথে সন্ধান করুন।

$ echo "212334123434test233" | awk -F'[^0-9]+' '{for(i=1;i<=NF;i++){m=length($i)>=length(m)||$i>m?$i:m}};END{print m}'
212334123434

আপনি RSকোনও অ-সংখ্যাসূচক চরিত্রের স্ট্রিং হতে বিশ্রী রেকর্ড বিভাজক ( ) সেট করতে পারেন :

$ echo "212334123434test233" \
    | awk -v RS='[^0-9]+' '
        length(longest) < length($0) {longest = $0};
        END{print longest}'
212334123434

2
কেন কেবল RS = '[^0-9]+'ওউকের অন্তর্নিহিত লুপটি সেট এবং ব্যবহার করবেন না ? echo "212334123434test233" | awk -v RS='[^0-9]+' 'length(longest) < length($0) {longest = $0};END{print longest}' 212334123434

@awk_FTW- কেও উত্তর হিসাবে আপনার এটিকে দেওয়া উচিত। :) আমাকে RSভেরিয়েবলটি দেখানোর জন্য ধন্যবাদ , আমি অবশ্যই এটি প্রথমবার দেখছি তা স্বীকার করতেই হবে। awkআমার চেয়ে বেশি প্রস্তাব দেওয়ার জন্য আপনার কাছে আরও টিপস রয়েছে !
hjk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.