35

在 bash 中,与

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

我可以得到一个数字序列,但在某些情况下我需要

01 02 03 ... 10

我怎么能得到这个?

我怎么能得到?

001 002 ... 010 011 .. 100
4

10 回答 10

61

这将在已coreutils安装的机器上的任何 shell 中工作(感谢评论者纠正我):

seq -w 1 10

seq -w 1 100

解释:

  • 该选项-w将:

根据需要用零填充来均衡所有数字的宽度。

  • seq [-w] [-f format] [-s string] [-t string] [first [incr]] last

打印一系列数字,每行一个(默认),从第一个(默认 1)到尽可能接近最后一个,增量为 incr(默认 1)。当 first 大于 last 时,默认 incr 为 -1

于 2012-08-09T20:11:11.800 回答
18

使用带-f参数的 seq 命令,尝试:

seq -f "%02g" 0 10

结果:00 01 02 03 04 05 06 07 08 09 10

seq -f "%03g" 0 10

结果:000 001 002 003 004 005 006 007 008 009 010

于 2016-03-09T09:00:37.087 回答
16
printf "%02d " {1..10} ; echo

输出:

01 02 03 04 05 06 07 08 09 10

相似地:

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

在最新版本的 bash 中,只需:

echo {01..10}

和:

echo {001..100}
于 2012-08-09T20:09:54.950 回答
5
$ 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

只需改变格式字符串中的字段宽度(在本例中为 2 和 3),当然还有大括号扩展范围。只是为了echo美观,因为格式字符串本身不包含换行符。

printf是内置的 shell,但您可能还安装了 coreutils 的版本,可以就地使用。

于 2012-08-09T20:22:47.557 回答
5

仅限awk:

awk 'BEGIN { for (i=0; i<10; i++) printf("%02d ", i) }'
于 2012-08-09T20:22:51.063 回答
4

以下将在 bash 中工作

echo {01..10}

**编辑看到我周围的答案我只是想添加这个,如果我们谈论的命令可以在任何终端下工作

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

或者

yes | head -n 10 | awk '{printf( "%03d ", NR )}'    ##for 01..10
于 2012-08-09T20:09:50.830 回答
4

有很多方法可以做到这一点!我个人最喜欢的是:

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

显然,thesed和 thegrep都不是必需的(这grep要微不足道,因为如果您省略 the ,则sed需要更改awk),但它们有助于解决方案的整体满意度!finalecho也不是必需的,但是有一个尾随换行符总是很好的。

另一个不错的选择是:

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

或者(不那么荒谬):

yes '' | sed ${top-100}q | nl -ba -w ${width-3} -n rz
于 2012-08-09T20:15:09.657 回答
4
echo 0{0..9}

您可以获得:00 01 02 03 04 05 06 07 08 09

echo 0{0..9} 1{0..9}

您可以获得:00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19

echo 00{0..9} 0{10..99}

你可以得到 001 .. 099

于 2018-10-22T15:50:12.510 回答
3

正如favouretti所说,seq是你的朋友。

但有一个警告:

seq -w使用第二个参数设置它将使用的格式。

因此,该命令seq -w 1 9将打印序列1 2 3 4 5 6 7 8 9

要打印序列 01 .. 09,您需要执行以下操作:

seq -w 1 09

或者为了清楚起见,在两端使用相同的格式,例如:

seq -w 000 010 适用于 001 002 003 ... 010 系列

您还可以使用一个也可以反向工作的 step 参数:

seq -w 10 -1 01' for 10,09,08...01 orseq -w 01 2 10` 用于 01,03,05,07,09

于 2015-11-12T09:26:41.370 回答
3
for i in {01..99}; do
  echo $i
done

将返回 :

01
02
03
04
05
06
07
08
09
10
...

将 01 替换为 001 并将 99 替换为 999 或 100 也会达到您的预期。

于 2020-09-23T12:28:33.890 回答