在具有任意起始范围或从 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 起点的请求。相反,上面的代码是一个通用解决方案,它计算输入的 min
imum Int
并从那里开始计数,returning 找到任何缺失的 Int
s 直到输入的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。
这个问题类似于
区别在于我想知道是否可以为列表指定一个起始范围
我注意到以下提供的解决方案:
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 起点的请求。相反,上面的代码是一个通用解决方案,它计算输入的 min
imum Int
并从那里开始计数,returning 找到任何缺失的 Int
s 直到输入的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。