Frage Bash-Folge 00 01 ... 10


in bash, mit

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

Ich kann eine Zahlenfolge bekommen, aber in einigen Fällen brauche ich

01 02 03 ... 10

Wie kann ich das bekommen?

und wie kann ich bekommen?

001 002 ... 010 011 .. 100

16
2017-08-09 20:08


Ursprung


Antworten:


Dies funktioniert in jeder Shell auf einem Rechner mit coreutils installiert (danke Kommentatoren für die Korrektur):

seq -w 1 10

und

seq -w 1 100

38
2017-08-09 20:11



printf "%02d " {1..10} ; echo

Ausgabe:

01 02 03 04 05 06 07 08 09 10

Ähnlich:

printf "%03d " {1..100} ; echo 

In neueren Versionen von bash, einfach:

echo {01..10}

Und:

echo {001..100}

9
2017-08-09 20:09



mit -f Parameter, versuche:

seq -f "%02g" 0 10


6
2018-03-09 09:00



$ printf "%02d " {0..10}; echo
00 01 02 03 04 05 06 07 08 09 10 
$ printf "%03d " {0..100}; echo
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100

Variieren Sie einfach die Feldbreite in der Formatzeichenfolge (in diesem Fall 2 und 3) und natürlich den geschweiften Klammerbereich. Das echo gibt es nur für kosmetische Zwecke, da die Formatzeichenfolge selbst keine neue Zeile enthält.

printf ist eine eingebaute Shell, aber Sie haben wahrscheinlich auch eine Version von Coreutils installiert, die direkt verwendet werden kann.


5
2017-08-09 20:22



awk nur:

awk 'BEGIN { for (i=0; i<10; i++) printf("%02d ", i) }'

5
2017-08-09 20:22



Es gibt so viele Möglichkeiten, dies zu tun! Mein persönlicher Favorit ist:

yes | grep y | sed 100q | awk '{printf( "%03d ", NR )}'; echo

Klar, weder die sed noch das grep sind notwendig (die grep viel trivialer zu sein, denn wenn Sie das weglassen sed Sie müssen die ändern awk), aber sie tragen zur Gesamtzufriedenheit der Lösung bei! Das endgültige echo ist auch nicht wirklich notwendig, aber es ist immer schön, einen nachgestellten Zeilenumbruch zu haben.

Eine weitere nette Option ist:

yes | nl -ba | tr ' ' 0 | sed 100q | cut -b 4-6

2
2017-08-09 20:15



Das Folgende wird in bash funktionieren

echo {01..10}

** BEARBEITEN Sie, die Antworten um mich herum zu sehen. Ich wollte das nur hinzufügen, wenn wir über Befehle sprechen, die unter jedem Terminal funktionieren

yes | head -n 100 | awk '{printf( "%03d ", NR )}'   ##for 001...100

oder

yes | head -n 10 | awk '{printf( "%03d ", NR )}'    ##for 01..10

2
2017-08-09 20:09



wie von Favoretti kommentiert, seq ist dein Freund.

Aber es gibt einen Vorbehalt:

seq -w verwendet das zweite Argument, um das Format festzulegen, das verwendet wird.

Also, der Befehl seq -w 1 9 wird die Sequenz drucken 1 2 3 4 5 6 7 8 9

Um die Sequenz 01 .. 09 zu drucken, müssen Sie Folgendes tun:

seq -w 1 09

Oder verwende aus Gründen der Klarheit das gleiche Format an beiden Enden, zum Beispiel:

seq -w 000 010  für die Serie 001 002 003 ... 010

Und Sie können auch ein Schrittargument verwenden, das auch umgekehrt funktioniert:

seq -w 10 -1 01' for 10,09,08...01 orseq -w 01 2 10` für 01,03,05,07,09


1
2017-11-12 09:26