根据零的数量增加数字

根据零的数量增加数字

我想要一个由"1234567890"重复至 length组成的字符串72。另一个长度相同且包含非零数字的字符串。我得到的不是数字零,而是从 开始递增的数字1

因此对于字符串

"1234567890123456789012345678901234567890"

我得到以下打印结果

         1         2         3         4
1234567890123456789012345678901234567890

我想这样做到底72

已经开始用空格删除非零值,但增加位置处的索引0是一个真正的问题。

  wz="1234567890"  # Basic measure of ten
  hg="${wz}${wz}${wz}${wz}${wz}${wz}${wz}12"
  
  ha=${hg//[123456789]/" "}

  printf '%s\n' "$ha"
  printf '%s\n' "$hg"

答案1

此函数进行所需的重复(最多 200 个字符),然后根据参数截断它们。

#! /bin/bash

Ruler () {  # (lth)

    local Tens Digs j

    printf -v Tens '%10d' {1..20}
    for (( j = 1; j <= 20; j++)); do Digs="${Digs}1234567890"; done
    printf '%s\n%s\n' "${Tens:0:${1}}" "${Digs:0:${1}}"
}

    Ruler 72
    Ruler 32

像这样:

$ ./Hdsup
         1         2         3         4         5         6         7  
123456789012345678901234567890123456789012345678901234567890123456789012
         1         2         3  
12345678901234567890123456789012

答案2

下列awk程序将产生两个“标尺”,每个标尺由一行数字组成。这第二行将从 1 到 10 进行编号(用 0 代替 10),数字之间没有中间间距。第一行的编号类似,但每个数字之间有一定的间距。

该程序采用两个可选的命令行参数。第一个参数是第二个标尺的总宽度(默认为 80),而第二个参数是第一个标尺编号的步长或制表符宽度(默认为 8,因为这是常见的制表符宽度) Unix 终端)。

运行示例:

$ ./ruler
       1       2       3       4       5       6       7       8       9       0
12345678901234567890123456789012345678901234567890123456789012345678901234567890
$ ./ruler 72
       1       2       3       4       5       6       7       8       9
123456789012345678901234567890123456789012345678901234567890123456789012
$ ./ruler 72 10
         1         2         3         4         5         6         7
123456789012345678901234567890123456789012345678901234567890123456789012
$ ./ruler 122 6
     1     2     3     4     5     6     7     8     9     0     1     2     3     4     5     6     7     8     9     0
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012

剧本ruler

#!/usr/bin/awk -f

BEGIN {
        width = ARGC >= 2 ? ARGV[1] : 80
        step  = ARGC >= 3 ? ARGV[2] : 8

        while (++i <= width) {
                if (i%step == 0) line1 = line1 sprintf("%*s", step, (i/step)%10)
                line2 = line2 (i%10)
        }

        print line1
        print line2
}

这本质上是在循环的每次迭代中将下一个数字添加到line2字符串(第二个标尺) ,同时在每次迭代中将带有数字的while右调整宽度字段添加到字符串(第一个标尺)。stepline1step

此代码中没有宽度限制,也没有对命令行参数进行清理或验证。

相关内容