在具有任意起始范围或从 1 开始的唯一顺序列表中打印缺失的数字

Print the missing number in a unique sequential list with an arbitrary starting range or starting from 1

这个问题类似于

区别在于我想知道是否可以为列表指定一个起始范围

我注意到以下提供的解决方案:

awk '{for(i=p+1; i<; i++) print i} {p=}' file1

perl -nE 'say for $a+1 .. $_-1; $a=$_'

file1如下:

5
6
7
8
15
16
17
20

运行 两种解决方案,它给出以下输出:

1
2
3
4
9
10
11
12
13
14
18
19

注意输出从 1 开始打印。

问题是如何传递一个任意的 starting/minimum 作为开始,如果没有提供,假设数字 1 作为 starting/minimum 数字?

9
10
11
12
13
14
18
19

是的,有时您希望起始编号为 1,但有时您希望起始编号为列表中最小的编号。

那些 one-liners 的细微变化以包括起点:

awk

# Optionally include start=NN before the first filename
$ awk 'BEGIN { start= 1 }
        < start { next }
        == start { p = start }
       { for (i = p + 1; i < ; i++) print i; p = }' start=5 file1
9
10
11
12
13
14
18
19
$ awk 'BEGIN { start= 1 }
        < start { next }
        == start { p = start }
       { for (i = p + 1; i < ; i++) print i; p = }' file1
1
2
3
4
9
10
11
12
13
14
18
19

perl

# Optionally include -start=NN before the first file and after the --
$ perl -snE 'BEGIN { $start //= 1 }
             if ($_ < $start) { next }
             if ($_ == $start) { $a = $start }
             say for $a+1 .. $_-1; $a=$_' -- -start=5 file1
9
10
11
12
13
14
18
19
$ perl -snE 'BEGIN { $start //= 1 }
             if ($_ < $start) { next }
             if ($_ == $start) { $a = $start }
             say for $a+1 .. $_-1; $a=$_' -- file1
1
2
3
4
9
10
11
12
13
14
18
19

您可以使用您的 awk 脚本,稍微修改一下,然后使用 -v 选项将初始 p 值传递给它:

$ awk 'BEGIN{p=p<1?1:p} {for(i=p; i<; i++) print i} {p=p<=?+1:p}' file1
1
2
3
4
9
10
11
12
13
14
18
19
$ awk -v p=10 'BEGIN{p=p<1?1:p} {for(i=p; i<; i++) print i} {p=p<=?+1:p}' file1
10
11
12
13
14
18
19

如果未指定或设置为 0 或负值,BEGIN 块会将 p 初始化为 1。循环从 p 而不是 p+1 开始,最后一个块将 +1 分配给 p(而不是 </code>),当且仅当 <code>p 小于或等于 </code>.</p> <p>这假定默认值 (1) 是您想要的最小起始编号。如果您想从 0 甚至负数开始,只需将 <code>BEGIN{p=p<1?1:p} 替换为 BEGIN{p=(p==""?1:p)}:

$ awk -v p=-2 'BEGIN{p=(p==""?1:p)} {for(i=p; i<; i++) print i} {p=p<=?+1:p}' file1
-2
-1
0
1
...

没有我希望的那么优雅:

< file | mawk '
         BEGIN {    _= int(_)^(\
               ( ORS = "")<_) 
         }  { ___[ __= [=10=] ] }
         END { 
            do { 
                print _ in ___ \
                      ? "" : _ "\n" 
            } while(++_ < __) }' \_=10          
10
11
12
13
14
18
19

使用 Raku(以前称为 Perl_6)

raku -e 'my @a=lines.map: *.Int; .put for (@a.Set (^) @a.minmax.Set).sort.map: *.key;'

示例输入:

5
6
7
8
15
16
17
20

示例输出:

9
10
11
12
13
14
18
19

这是一个用 Raku 编码的答案,Raku 是 Perl-family 编程语言的一员。不,它没有解决 OP 对 user-definable 起点的请求。相反,上面的代码是一个通用解决方案,它计算输入的 minimum Int 并从那里开始计数,returning 找到任何缺失的 Ints 直到输入的max最多Int.

真的需要user-defined下限吗?试试下面的代码,它允许你设置一个 $init 变量:

~$ raku -e 'my @a=lines.map: *.Int; my $init = 1; .put for (@a.Set (^) ($init..@a.max).Set).sort.map: *.key;' 
1
2
3
4
9
10
11
12
13
14
18
19

有关解释和更短的代码(包括 single-line return and/or return 没有排序),请参阅下面的 link。


https://raku.org