這個問題類似于如何在 unix 終端中的唯一和順序串列(每行一個)中找到丟失的整數?.
不同之處在于我想知道是否可以為串列指定起始范圍
我注意到以下提供的解決方案:
awk '{for(i=p 1; i<$1; i ) print i} {p=$1}' file1
和
perl -nE 'say for $a 1 .. $_-1; $a=$_'
檔案1如下:
5 6 7 8 15 16 17 20
運行這兩種解決方案,它會提供以下輸出:
1 2 3 4 9 10 11 12 13 14 18 19
請注意,輸出從 1 開始列印。
問題是如何傳遞任意起始/最小值開始,如果沒有提供,假設數字 1 作為起始/最小數字?
9 10 11 12 13 14 18 19
是的,有時您希望起始編號為 1,但有時您希望起始編號為串列中的最小編號。
uj5u.com熱心網友回復:
您可以使用awk
稍作修改的腳本,并通過p
以下選項將初始值傳遞給它-v
:
$ awk 'BEGIN{p=p?p:1} {for(i=p; i<$1; i ) print i} {p=p<=$1?$1 1:p}' file1
1
2
3
4
9
10
11
12
13
14
18
19
$ awk -vp=10 'BEGIN{p=p?p:1} {for(i=p; i<$1; i ) print i} {p=p<=$1?$1 1:p}' file1
10
11
12
13
14
18
19
如果未指定,則該BEGIN
塊初始化為 1。p
回圈開始于p
而不是p 1
,并且最后一個塊分配$1 1
給p
(而不是$1
),當且僅當p
小于或等于$1
。
uj5u.com熱心網友回復:
這些單行的細微變化包括一個起點:
awk
# Optionally include start=NN before the first filename
$ awk 'BEGIN { start= 1 }
$1 < start { next }
$1 == start { p = start }
{ for (i = p 1; i < $1; i ) print i; p = $1}' start=5 file1
9
10
11
12
13
14
18
19
$ awk 'BEGIN { start= 1 }
$1 < start { next }
$1 == start { p = start }
{ for (i = p 1; i < $1; i ) print i; p = $1}' 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
uj5u.com熱心網友回復:
不像我希望的那樣優雅:
< file | mawk '
BEGIN { _= int(_)^(\
( ORS = "")<_)
} { ___[ __= $0 ] }
END {
do {
print _ in ___ \
? "" : _ "\n"
} while( _ < __) }' \_=10
10
11
12
13
14
18
19
uj5u.com熱心網友回復:
$ awk -v b=4 '{a[$1]; e=$1} END{for (i=(b==""?1:b); i<=e; i ) if (!(i in a)) print i}' file
4
9
10
11
12
13
14
18
19
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/467171.html
下一篇:如果與/||/&&在perl中