在 bash 中,如何添加带有前导零的整数并维护指定的缓冲区

发布于 2024-09-08 07:04:39 字数 185 浏览 6 评论 0原文

例如,我想从 001 数到 100。这意味着零缓冲区将从 2、1 开始,当达到 100 或更多时最终为 0。

前任: 001 002 ... 010 011 ... 098 099 100

如果数字具有 printf "%02d" $i 预定义的零个数,我就可以做到这一点 。但这是静态的而不是动态的,在我的示例中不起作用。

For example, I want to count from 001 to 100. Meaning the zero buffer would start off with 2, 1, then eventually 0 when it reaches 100 or more.

ex:
001
002
...
010
011
...
098
099
100

I could do this if the numbers had a predefined number of zeroes with printf "%02d" $i. But that's static and not dynamic and would not work in my example.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

亣腦蒛氧 2024-09-15 07:04:39

如果通过静态与动态您的意思是您希望能够使用宽度变量,您可以这样做:

$ padtowidth=3
$ for i in 0 {8..11} {98..101}; do printf "%0*d\n" $padtowidth $i; done
000
008
009
010
011
098
099
100
101

星号被替换为参数列表中它对应的变量值($ padtowidth 在本例中)。

否则,您的示例不起作用的唯一原因是您使用“2”(也许它是要应用的最大填充),而它应该是“3”(如我的示例中),因为该值是结果总数宽度(不是仅焊盘宽度)。

If by static versus dynamic you mean that you'd like to be able to use a variable for the width, you can do this:

$ padtowidth=3
$ for i in 0 {8..11} {98..101}; do printf "%0*d\n" $padtowidth $i; done
000
008
009
010
011
098
099
100
101

The asterisk is replaced by the value of the variable it corresponds to in the argument list ($padtowidth in this case).

Otherwise, the only reason your example doesn't work is that you use "2" (perhaps as if it were the maximum padding to apply) when it should be "3" (as in my example) since that value is the resulting total width (not the pad-only width).

差↓一点笑了 2024-09-15 07:04:39

如果您的系统有,请尝试使用 seq-w (--equal-width) 选项:

$ seq -s, -w 1 10
01,02,03,04,05,06,07,08,09,10

$ for i in `seq -w 95 105` ; do echo -n " $i" ; done
095 096 097 098 099 100 101 102 103 104 105

If your system has it, try seq with the -w (--equal-width) option:

$ seq -s, -w 1 10
01,02,03,04,05,06,07,08,09,10

$ for i in `seq -w 95 105` ; do echo -n " $i" ; done
095 096 097 098 099 100 101 102 103 104 105
葬花如无物 2024-09-15 07:04:39

在 Bash 版本 4(使用 bash -version)中,您可以使用 大括号扩展。在任一限制之前放置 0 会强制数字用零填充

echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...

In Bash version 4 (use bash -version) you can use brace expansion. Putting a 0 before either limit forces the numbers to be padded by zeros

echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
烟雨凡馨 2024-09-15 07:04:39
#!/bin/bash

max=100; 

for ((i=1;i<=$max;i++)); do 
    printf "%0*d\n" ${#max} $i
done

上面的代码将根据最大/最终值包含的位数,自动用正确数量的 0 填充您的数字。您所需要做的就是更改 max 变量,它将处理其余的事情。

示例:

最大值=10

01
02
03
04
05
06
07
08
09
10

最大值=100

001
002
003
004
005
006
...
097
098
099
100

最大值=1000

0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000
#!/bin/bash

max=100; 

for ((i=1;i<=$max;i++)); do 
    printf "%0*d\n" ${#max} $i
done

The code above will auto-pad your numbers with the correct number of 0's based upon how many digits the max/terminal value contains. All you need to do is change the max variable and it will handle the rest.

Examples:

max=10

01
02
03
04
05
06
07
08
09
10

max=100

001
002
003
004
005
006
...
097
098
099
100

max=1000

0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000
以往的大感动 2024-09-15 07:04:39
# jot is available on FreeBSD, Mac OS X, ...    
jot -s " " -w '%03d' 5   
jot -s " " -w '%03d' 10  
jot -s " " -w '%03d' 50  
jot -s " " -w '%03d' 100   
# jot is available on FreeBSD, Mac OS X, ...    
jot -s " " -w '%03d' 5   
jot -s " " -w '%03d' 10  
jot -s " " -w '%03d' 50  
jot -s " " -w '%03d' 100   
惯饮孤独 2024-09-15 07:04:39

如果您需要使用可变填充将值填充到可变数字:

$values_count=514;
$padding_width=5;

for i in 0 `seq 1 $(($values_count - 1))`; do printf "%0*d\n" $padding_width $i; done;

这将打印出 00000, 00001, ... 00513。
(我没有找到任何当前的答案满足我的需要)

If you need to pad values up to a variable number with variable padding:

$values_count=514;
$padding_width=5;

for i in 0 `seq 1 $(($values_count - 1))`; do printf "%0*d\n" $padding_width $i; done;

This would print out 00000, 00001, ... 00513.
(I didn't find any of the current answers meeting my need)

忱杏 2024-09-15 07:04:39

为了补充@DennisWilliamson的答案

seq-f参数是实现相同目的的一种可能方法:

$ seq -f "%03g" 1 100
001
002
003
...
098
099
100

这里,3 设置根据需要用前导零填充的位数,并且可以设置为任何正整数。不过,这可能需要足够新的 seq 版本。请参阅 @AminAbbaspour 在另一个帖子中的答案,这归功于谁。

上面的输出可以在 echo 中使用(如果前面提到过大括号扩展不是一个选项)和printf,如果有必要的话。例如:

$ for i in $(seq -f "%03g" 1 100); do echo "file-${i}.log"; done
file-001.log
file-002.log
file-003.log
...
file-098.log
file-099.log
file-100.log

当然,对于这种简单的情况,通过 for 循环和 printf/echo 绕道可能会有点过分 – seq 单独可以产生相同的输出:

seq -f "file-%03g.log" 1 100

To complement @DennisWilliamson's answer:

seq's -f parameter is a possible way to achieve the same:

$ seq -f "%03g" 1 100
001
002
003
...
098
099
100

Here, 3 sets the number of digits to pad with leading zeros as necessary, and can be set to any positive integer. This might require a sufficiently recent version of seq, though. See @AminAbbaspour's answer in another thread, who the credit goes to.

Above output could be used in both echo (if its before-mentioned brace expansion isn't an option) and printf, as well, if necessary. E.g.:

$ for i in $(seq -f "%03g" 1 100); do echo "file-${i}.log"; done
file-001.log
file-002.log
file-003.log
...
file-098.log
file-099.log
file-100.log

Of course, for such simple cases, the detour via for loop and printf/echo might be overkill – seq alone can produce the same output:

seq -f "file-%03g.log" 1 100
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文