2012-01-09 9 views
261

मैं मैं 5. तो अगर इनपुट 1 है, मैं सामने शून्य जोड़ने की जरूरत है ऐसी है कि वह 00001 हो जाता है यह निश्चित लंबाई के होने की जरूरत है, पाश कुछ मान की जरूरत हैबैड में पूर्णांक के अनुक्रम को पैड कैसे शून्य करें ताकि सभी की एक ही चौड़ाई हो?

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

$first के लिए और $last, । यह उदाहरण के लिए 99999 तक लूप होता है, लेकिन लंबाई 5.

उदा .: 00002, 00042, 00212, और बहुत आगे हो गया है।

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

+10

एक अच्छा जवाब हो सकता है: seq - डब्ल्यू 1 99999. विकल्प डब्ल्यू 0. –

+0

साथ उत्पादन लंबाई निरंतर, कम से कम संख्या padding रहता है इसके अलावा फ़ाइलों का नाम: http: // '% 05d' के बजाय stackoverflow.com/questions/55754/bash-script-to-pad-file-names –

उत्तर

440

का उपयोग कर अपने विशिष्ट मामले में हालांकि यह यह संख्या फ़ॉर्मेट करने के लिए के रूप में यह सूची आउटपुट प्राप्त करने के लिए seq को -f झंडा उपयोग करने के लिए शायद सबसे आसान है सरल। उदाहरण के लिए:

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

निम्नलिखित उत्पादन का उत्पादन होगा:

00010 
00011 
00012 
00013 
00014 
00015 

आम तौर पर, bashprintf के रूप में एक अंतर्निहित में तो आप शून्य के साथ पैड उत्पादन इस प्रकार कर सकते हैं:

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

आप अन्य चर में आउटपुट को स्टोर करने के लिए -v ध्वज का उपयोग कर सकते हैं:

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

सूचना है कि printfseq को एक अलग प्रारूप का समर्थन करता है ताकि आप %05d बजाय %05g उपयोग करने के लिए की जरूरत है। इस तरह

+1

'% 05g' मेरे लिए तय किया गया है। _ "00026" _ मुझे _ "00022" _ दे रहा था। धन्यवाद! –

+6

ग्रेट, व्यापक उत्तर। एक छोटा सुधार: कड़ाई से बोलते हुए, 'seq' प्रारूप वर्णों के _subset_ का समर्थन करता है। कि 'printf' समर्थन करता है (और उस सबसेट में 'g' शामिल है, लेकिन' d' नहीं)। अक्षरों 'डी' और' जी 'का व्यवहार उस' डी' में '0'-prefixed संख्या स्ट्रिंग्स को _octal_ संख्याओं के रूप में व्याख्या करता है और उन्हें दशमलव में परिवर्तित करता है, जबकि 'g' उन्हें दशमलव के रूप में व्यवहार करता है। (@EdManet: यही कारण है कि '00026' 'डी' के साथ '00022' में बदल गया)। उल्लेख करने योग्य एक और बात: 'seq -w' उत्पन्न होने वाली विस्तृत संख्या के आधार पर आउटपुट संख्याओं के _automatic_ शून्य-पैडिंग करता है। – mklement0

+0

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

56

"% 05d" के साथ printf का उपयोग करें उदा।

printf "%05d" 1 
13

बहुत printf

[jaypal:~/Temp] printf "%05d\n" 1 
00001 
[jaypal:~/Temp] printf "%05d\n" 2 
00002 
9

उपयोग 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 जो उपलब्ध नहीं * nix के सभी जायके पर है का उपयोग कर बच सकते हैं।

+1

हम 'awk's' 'BEGIN' कथन का उपयोग कर सकते हैं ताकि हमें' हेरेडोक 'असाइनमेंट का उपयोग न करना पड़े। –

+0

@ जयपालसिंह: धन्यवाद दोस्त, यह एक अच्छा मुद्दा है। मेरा जवाब अपडेट किया गया। – anubhava

80

आसान अभी भी तुम सिर्फ

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

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

+0

काम करता है, लेकिन मेरे बैश – user2707001

43

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

seq -w 1 10 

01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
+2

पर शून्य गद्देदार तार नहीं देता है यह स्पष्ट रूप से सही उत्तर है। इसमें इतने कम अपवॉट क्यों हैं? – adius

+2

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

+1

के साथ कितने शून्य का अंत करेंगे, यह निर्दिष्ट निश्चित लंबाई नहीं देता है, केवल परिणाम जो सभी _same_ लंबाई हैं। – Ceisc

5

अधिक अंक (शून्य) के साथ मैं पैड उत्पादन की तुलना में मैं फिर पूंछ का उपयोग की जरूरत है केवल अंक मैं देख रहा हूँ की संख्या का उपयोग का उत्पादन। सूचना आप पूंछ में '6' का उपयोग करना होगा, आप एन अंक चाहते हैं अंतिम पाँच अंक :)

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

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

2

मिल जोड़ने 10^एन और पहले अंक से हटाने के लिए।

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

आउटपुट:

01 
02 
03 
04 
05