कैसे पैड में शून्य का एक अनुक्रम पैड पैड किया जाए ताकि सभी की चौड़ाई समान हो?


426

मुझे कुछ मूल्यों को लूप करने की आवश्यकता है,

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

के लिए $firstऔर $last, मैं इसे निश्चित लंबाई का होना 5. तो अगर इनपुट है की जरूरत है 1मैं सामने ऐसे में शून्य जोड़ने के लिए है कि यह हो जाता है की जरूरत है, 00001। यह 99999उदाहरण के लिए छोर तक है, लेकिन लंबाई 5 होनी चाहिए।

उदाहरण के लिए: 00002, 00042, 00212, 012312और आगे तो।

मैं कैसे कर सकता हूँ पर कोई विचार?


22
एक अच्छा जवाब हो सकता है: seq - w 1 99999। विकल्प -w आउटपुट को निरंतर बनाए रखता है, 0. के साथ सबसे कम संख्या में पैडिंग करता है
ब्रूनो वॉन पेरिस


यहां कई उत्तर सुझाते हैं for variable in $(something to generate the numbers); do ...लेकिन संख्याओं की सूची लंबी होने पर यह समस्याग्रस्त है। यह उपयोग करने के लिए बहुत अधिक कुशल है something to generate the numbers | while read -r variable; do ...Mywiki.wooledge.org/DontReadLinesWithFor को भी देखें जिसमें फाइलों आदि से लाइनों को पढ़ने की चर्चा है, लेकिन कुछ तर्क यहाँ भी लागू होते हैं।
त्रिवेणी

जवाबों:


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समर्थन करता है । वह समर्थन करता है (और वह सबसेट शामिल है , लेकिन नहीं )। वर्णों का व्यवहार और अलग - अलग रूप से उस व्याख्या में अलग - अलग संख्याओं को अष्टक संख्याओं के रूप में स्ट्रिंग करता है और उन्हें दशमलव में परिवर्तित करता है , जबकि उन्हें दशमलव के रूप में मानता है। (@EdManet: इसीलिए '00026' '00022' में बदल गया )। एक और बात ध्यान देने योग्य है: उत्पन्न संख्या के आधार पर आउटपुट संख्याओं का स्वत: शून्य-पैडिंग करता है। printfgddgd0gdseq -w
mklement0

इससे मुझे हेक्स वर्ण सूची बनाने में मदद मिली। for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txtएक 8 वर्ण हेक्साडेसिमल सूची का उत्पादन किया। धन्यवाद।
सीडी

seq --help: "FORMAT को टाइप 'डबल' के एक तर्क को प्रिंट करने के लिए उपयुक्त होना चाहिए; यह% .PRECf के लिए डिफ़ॉल्ट है अगर FIRST, INCREMENT और LAST सभी सटीक दशमलव दशमलव संख्या अधिकतम परिशुद्धता PREC के साथ, और% g अन्यथा हैं।" संभव रूपांतरण विनिर्देशक हैं efgaEFGA
x-yuri

133

आसान अभी भी आप बस कर सकते हैं

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

16
यह बैश संस्करण 4.1.2 (CentOS 6) पर काम करता है, लेकिन संस्करण 3.2.25 (CentOS 5) में विफल रहता है। मैं इस बात से सहमत हूँ कि यह करने के लिए बहुत अधिक सौंदर्यवादी रूप से मनभावन तरीका है!
माइक स्ट्रॉव

1
काम करता है, लेकिन मेरे bash पर शून्य गद्देदार तार नहीं देता है
user2707001

Mac (Bash 4.4) पर, यह संख्याओं को पैड नहीं करता है। CentOS और SuSE पर, यह बहुत अच्छा काम करता है!
स्टीफन लासिवस्की

यह बैश के साथ 4.4.23(1)-release
macOS

ओएस एक्स पर बैश 5 पर या तो काम नहीं करता है, दुख की बात है
gotofritz

91

यदि अनुक्रम के अंत में पैडिंग की अधिकतम लंबाई है (उदाहरण के लिए, यदि आप 5 अंक चाहते हैं और कमांड "seq 1 10000" है), तो आप seq के लिए "-w" ध्वज का उपयोग कर सकते हैं - यह स्वयं पैडिंग जोड़ता है।

seq -w 1 10

उत्पादित करें

01
02
03
04
05
06
07
08
09
10

7
यह स्पष्ट रूप से सही उत्तर है। इसमें इतनी उथल-पुथल क्यों है? 😳
adius

5
आसान, क्योंकि पैडिंग उस अधिकतम संख्या पर निर्भर करती है जिस तक आप पहुंचना चाहते हैं। यदि यह एक ऐसा पैरामीटर है जिसे आप पहले कभी नहीं जानते हैं कि आप कितने शून्य के साथ समाप्त होंगे
गूलर

5
यह निर्दिष्ट निश्चित लंबाई नहीं देता है, बस परिणाम जो सभी एक ही लंबाई के हैं।
Ceisc

78

"% 05d" जैसे प्रिंट का उपयोग करें

printf "%05d" 1


12

इस तरह awk का उपयोग करें:

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

यदि आप पूंछ के -c तर्क में स्थानों की सही संख्या का उपयोग करना चाहते हैं, तो आप 'इको-एन 00000 $ i' का उपयोग कर सकते हैं क्योंकि यह एक नई पंक्ति को आउटपुट करना बंद कर देता है, जो कि चार्ट में से एक है पूंछ वापस आ रही है, इसलिए इसकी आवश्यकता है इस उत्तर में उच्चतर बनो। फिर आप जो कर रहे हैं, उसके आधार पर, नई पंक्ति, यदि छोड़ दी जाती है, तो परिणामों को प्रभावित कर सकती है।
Ceisc

लूप में चर को ट्रिम करने के लिए एक बाहरी प्रक्रिया का उपयोग करना अक्षम है। आप इसके बजाय शेल के पैरामीटर विस्तार सुविधाओं का उपयोग कर सकते हैं । बैश में इंडेक्स द्वारा किसी विशेष सबस्ट्रिंग को निकालने की सुविधा होती है, या आप एक पैटर्न के साथ उपसर्ग और प्रत्यय के प्रतिस्थापन का उपयोग कर सकते हैं, जो वांछित चौड़ाई से मेल खाता है, हालांकि इसके लिए थोड़ा पीछे की ओर की आवश्यकता होती है।
त्रिवेणी

4

यदि आप N अंक चाहते हैं, तो 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 अंक)।

2.) इसके अलावा, 'sed -n' का उपयोग करके आप कौन से नंबर चाहते हैं (इस मामले में, हम 1-100 नंबर चुनते हैं)।

3.) प्रत्येक नंबर से 'इको'। चर 'i' में संग्रहीत हैं, '$' का उपयोग करके पहुँचा।

पेशेवरों: यह कोड बहुत साफ है।

विपक्ष: 'seq' सभी लिनक्स सिस्टम के लिए मूल नहीं है (जैसा कि मैं समझता हूं)

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

मैक OSX 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 सेकंड में चला गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.