বাশে পূর্ণসংখ্যার ক্রম শূন্য প্যাড কিভাবে করবেন যাতে সকলের একই প্রস্থ থাকে?


426

আমার কিছু মান লুপ করা দরকার,

for i in $(seq $first $last)
do
    does something here
done

জন্য $firstএবং $last, আমার এটির দৈর্ঘ্য 5 হওয়া দরকার So সুতরাং যদি ইনপুট হয় 1তবে আমার সামনে জিরো যুক্ত করা দরকার যা এটি হয়ে যায় 0000199999উদাহরণস্বরূপ এটি লুপ করে তবে দৈর্ঘ্য 5 হতে হবে।

উদাহরণ: 00002, 00042, 00212, 012312এদিক ওদিক তাই।

আমি কীভাবে এটি করতে পারি তার কোনও ধারণা?


22
একটি ভাল উত্তর হতে পারে: seq - ডাব্লু 1 99999. বিকল্প - আমরা আউটপুট দৈর্ঘ্য স্থির রাখে, সংক্ষিপ্ত সংখ্যা 0 সহ প্যাডিং
ব্রুনো ফন প্যারিস


এখানে অনেক উত্তর সুপারিশ করে for variable in $(something to generate the numbers); do ...তবে সংখ্যার তালিকা দীর্ঘ হলে এটি সমস্যাযুক্ত। এটি ব্যবহার করা অনেক বেশি দক্ষ something to generate the numbers | while read -r variable; do ...। এছাড়াও mywiki.wooledge.org/DontReadLinesWith দেখুন যা ফাইল ইত্যাদি থেকে লাইন পড়ার বিষয়ে আলোচনা করে তবে কিছু যুক্তি এখানে প্রয়োগ করা হয়।
ট্রিপলি

উত্তর:


710

আপনার নির্দিষ্ট ক্ষেত্রে এটি সম্ভবত তালিকাটি আউটপুট হিসাবে সংখ্যার ফর্ম্যাট -fকরার seqজন্য পতাকাটি ব্যবহার করা সবচেয়ে সহজ । উদাহরণ স্বরূপ:

for i in $(seq -f "%05g" 10 15)
do
  echo $i
done

নিম্নলিখিত আউটপুট উত্পাদন করবে:

00010
00011
00012
00013
00014
00015

আরও সাধারণভাবে, অন্তর্নির্মিত হিসাবে bashরয়েছে printfযাতে আপনি জিরো দিয়ে আউটপুট প্যাড করতে পারেন:

$ i=99
$ printf "%05d\n" $i
00099

আপনি -vঅন্য পরিবর্তনশীলতে আউটপুট সংরক্ষণ করতে পতাকা ব্যবহার করতে পারেন :

$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099

লক্ষ্য করুন যা printfকিছুটা আলাদা ফর্ম্যাটকে সমর্থন করে seqযাতে আপনার %05dপরিবর্তে ব্যবহার করা দরকার %05g


5
%05gপরিবর্তে %05dআমার জন্য এটি স্থির। "00026" আমাকে দান করেন "00022" । ধন্যবাদ!
এড মানেট

12
দুর্দান্ত, ব্যাপক উত্তর। একটি ছোট সংশোধন: কঠোরভাবে বলতে গেলে, বিন্যাসের অক্ষরের seqএকটি উপসেট সমর্থন করে। এটি printfসমর্থন করে (এবং এতে সাবসেটগুলি অন্তর্ভুক্ত রয়েছে gতবে নয় d)। অক্ষরের আচরণ dএবং gচতুরভাবে যে পৃথক dব্যাখ্যা করে 0যেমন সংখ্যা স্ট্রিং -prefixed অকট্যাল , সংখ্যা এবং দশমিক পরিবর্তিত তাদের যেহেতু gতাদের দশমিক যেমন একইরূপে। (@ এডমনেট: এজন্য '00026' এর সাথে '00022' তে পরিণত হয়েছে d)। উল্লেখযোগ্য আরেকটি বিষয়: উত্পন্ন বিস্তৃত সংখ্যার ভিত্তিতে আউটপুট সংখ্যার স্বয়ংক্রিয় শূন্য-প্যাডিং seq -wকরে does
এমকিলেমেন্ট 0

এটি আমাকে হেক্স অক্ষর তালিকা তৈরি করতে সহায়তা করেছে। for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txtএকটি 8 চরিত্রের হেক্সাডেসিমাল তালিকা তৈরি করেছে। ধন্যবাদ।
সিডিডি

seq --help: "'ডাবল' টাইপের একটি যুক্তি মুদ্রণের জন্য ফর্ম্যাট অবশ্যই উপযুক্ত; এটি% এর মধ্যে ডিফল্ট থাকে P সম্ভাব্য রূপান্তর নির্দিষ্টকরণকারী হয় efgaEFGA
এক্স-ইয়ুরি

133

আরও সহজ এখনও আপনি করতে পারেন

for i in {00001..99999}; do
  echo $i
done

16
এটি বাশ সংস্করণ 4.1.2 (CentOS 6) এ কাজ করে তবে সংস্করণ 3.2.25 (CentOS 5) এ ব্যর্থ হয়। আমি সম্মত হই যে এটি করার জন্য এটি আরও অনেক নান্দনিকভাবে আনন্দদায়ক উপায়!
মাইক স্টারভ

1
কাজ করে, তবে আমার
বাশে

একটি ম্যাকে (4.4 বাশ), এটি সংখ্যাগুলিকে প্যাড করে না। CentOS & SuSE এ এটি দুর্দান্ত কাজ করে!
স্টেফান লাসিউস্কি

এটি 4.4.23(1)-release
ম্যাসোস-এর


91

সিক্যুয়েন্সের শেষে যদি প্যাডিংয়ের সর্বাধিক দৈর্ঘ্য থাকে (উদাহরণস্বরূপ, আপনি যদি 5 টি সংখ্যা চান এবং কমান্ডটি "সিক 1 1 10000" থাকে) তবে আপনি সেকের জন্য "-w" পতাকা ব্যবহার করতে পারেন - এটি নিজেই প্যাডিং যুক্ত করে।

seq -w 1 10

উৎপাদন করা

01
02
03
04
05
06
07
08
09
10

7
এটি অবশ্যই সঠিক উত্তর। এটির কেন এত সংখ্যক উপাখ্যান রয়েছে? 😳
অ্যাডিয়াস

5
সহজ, কারণ প্যাডিং আপনি যে সর্বোচ্চ সংখ্যায় পৌঁছাতে চান তার উপর নির্ভর করে। যদি এটি একটি প্যারামিটার আপনি পূর্বেই কতগুলো শূন্য আপনার সাথে শেষ হবে না হয়
guillem

5
এটি একটি নির্দিষ্ট নির্দিষ্ট দৈর্ঘ্য দেয় না, কেবল একই ফলাফলগুলি যা একই দৈর্ঘ্যের সমস্ত।
সিসিস

78

"% 05d" উদাহরণ সহ প্রিন্টফ ব্যবহার করুন

printf "%05d" 1


12

এর মতো বিশ্রী ব্যবহার করুন:

awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}'

আউটপুট:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

হালনাগাদ:

খাঁটি বাশ বিকল্প হিসাবে আপনি একই আউটপুট পেতে এটি করতে পারেন:

for i in {1..10}
do
   printf "%05d\n" $i
done

এইভাবে আপনি একটি বাহ্যিক প্রোগ্রাম ব্যবহার করা এড়াতে পারেন seqযা * নিক্সের সমস্ত স্বাদে পাওয়া যায় না


1
আমরা awk's BEGINবিবৃতিটি ব্যবহার করতে পারি যাতে আমাদের heredocঅ্যাসাইনমেন্টটি ব্যবহার করতে না হয় ।
জয়পাল সিংহ

@ জয়পালসিংহ: ধন্যবাদ সাথী, এটি একটি ভাল বিষয়। আমার উত্তর আপডেট।
অনুভা

9

আমি আমার প্রয়োজনের চেয়ে বেশি সংখ্যার (জিরো) আউটপুট প্যাড করি তবে আমি যে সংখ্যার সন্ধান করছি তার সংখ্যাটি ব্যবহার করতে লেজ ব্যবহার করুন। লক্ষ্য করুন যে আপনাকে শেষ পাঁচটি সংখ্যা পেতে লেজে '6' ব্যবহার করতে হবে :)

for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done

আপনি যদি লেজের টি-সি যুক্তিতে সঠিক সংখ্যক জায়গাগুলি ব্যবহার করতে চান তবে আপনি 'ইকো-এন 00000 $ i' ব্যবহার করতে পারেন কারণ এটি একটি নতুন লাইনের আউটপুট থামিয়ে দেয় যা অক্ষরের একটি লেজ ফিরে আসছে, সুতরাং এটির প্রয়োজন এই উত্তরে এক হতে হবে। আপনি তখন যা করছেন তার উপর নির্ভর করে, নিউলাইন, যদি ছেড়ে যায়, তবে ফলাফলগুলিতে প্রভাব ফেলতে পারে।
সিসিস

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

4

আপনি যদি এন সংখ্যা চান, তবে 10 ^ N যুক্ত করুন এবং প্রথম সংখ্যাটি মুছুন।

for (( num=100; num<=105; num++ ))
do
  echo ${num:1:3}
done

আউটপুট:

01
02
03
04
05

2

এটিও কাজ করবে:

for i in {0..9}{0..9}{0..9}{0..9}
do
  echo "$i"
done

চমৎকার সমাধান! পরিষ্কার, পড়তে সহজ, কোনও অতিরিক্ত প্রোগ্রামের প্রয়োজন নেই।
জোনাথন ক্রস

2

অন্য মাধ্যম :

zeroos="000"
echo 

for num in {99..105};do
 echo ${zeroos:${#num}:${#zeroos}}${num}
done

যে কোনও সংখ্যাকে রূপান্তর করতে এত সহজ কাজ হবে:

function leading_zero(){

    local num=$1
    local zeroos=00000
    echo ${zeroos:${#num}:${#zeroos}}${num} 

}

0

1.) 1 থেকে 1000 পর্যন্ত 'সেক' সংখ্যার ক্রম তৈরি করুন এবং প্রস্থটি '-w' ঠিক করুন (প্রস্থটি শেষ সংখ্যার দৈর্ঘ্যের দ্বারা নির্ধারিত হয়, এই ক্ষেত্রে 1000 এর জন্য 4 সংখ্যা) s

২) এছাড়াও, 'সেড-এন' ব্যবহার করে আপনি কোন নম্বরগুলি চান তা নির্বাচন করুন (এই ক্ষেত্রে, আমরা সংখ্যাগুলি 1-100 নির্বাচন করি)।

৩) প্রতিটি সংখ্যা 'প্রতিধ্বনি' করুন নম্বরগুলি 'i' ভ্যারিয়েবলে সংরক্ষণ করা হয়, 'able' ব্যবহার করে অ্যাক্সেস করা হয়।

পেশাদাররা: এই কোডটি বেশ পরিষ্কার।

কনস: 'সেক' সমস্ত লিনাক্স সিস্টেমে নেটিভ নয় (যেমন আমি বুঝতে পারি)

for i in `seq -w 1 1000 | sed -n '1,100p'`; 
do 
    echo $i; 
done

0

আপনি যদি নির্দিষ্ট দৈর্ঘ্য অর্জনের জন্য শূন্যগুলির সাথে সংখ্যার প্যাডিংয়ের পরে থাকেন তবে কেবলমাত্র 10 উদাহরণের মধ্যে নিকটতম একাধিক যুক্ত করুন। 2 সংখ্যার জন্য, 10 ^ 2 যোগ করুন, তারপরে আউটপুট প্রদর্শনের আগে প্রথম 1 টি সরিয়ে ফেলুন।

এই দ্রবণটি কোনও দৈর্ঘ্যের একক সংখ্যার প্যাড / ফর্ম্যাট করতে বা লুপের জন্য একটি ব্যবহার করে সংখ্যার পুরো ক্রমকে কাজ করে।

# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf

pad=100000      ;# 5 digit fixed

for i in {0..99999}; do ((j=pad+i))
    echo ${j#?}
done

ম্যাক ওএসএক্স 10.6.8, বাশ ভেরি 3.2.48 এ পরীক্ষিত


0

বাহ্যিক প্রক্রিয়া কাঁটাচামচ ব্যবহার না করে একটি উপায় হ'ল ম্যানিপুলেশনকে স্ট্রিং করে, জেনেরিক ক্ষেত্রে এটি দেখতে এরকম দেখাবে:

#start value
CNT=1

for [whatever iterative loop, seq, cat, find...];do
   # number of 0s is at least the amount of decimals needed, simple concatenation
   TEMP="000000$CNT"
   # for example 6 digits zero padded, get the last 6 character of the string
   echo ${TEMP:(-6)}
   # increment, if the for loop doesn't provide the number directly
   TEMP=$(( TEMP + 1 ))
done

এটি ডাব্লুএসএল-তেও বেশ ভাল কাজ করে, যেখানে কাঁটাচামচ করা সত্যিই ভারী অপারেশন। আমার কাছে একটি 110000 ফাইলের তালিকা ছিল, printf "%06d" $NUM1 মিনিটের বেশি সময় ব্যবহার করে , উপরের সমাধানটি প্রায় 1 সেকেন্ডে চলে।

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