Bash 提取序列中缺少的数字
我使用Bash 提取序列中缺少的数字,bash,shell,Bash,Shell,我使用grep从文件中提取了一些数字,假设它们是123561118。为了获得1..20中的缺失,我将它们放入文件中,并使用comm进行比较 a='1 2 3 5 6 11 18' printf '%d\n' $a | sort -u > 111 printf '%d\n' {1..20} | sort -u > 222 comm 111 222 rm 111 222 哪个输出 1 10 11 12 13 14 15 16 17 18 19 2 20
grep
从文件中提取了一些数字,假设它们是123561118
。为了获得1..20
中的缺失,我将它们放入文件中,并使用comm
进行比较
a='1 2 3 5 6 11 18'
printf '%d\n' $a | sort -u > 111
printf '%d\n' {1..20} | sort -u > 222
comm 111 222
rm 111 222
哪个输出
1
10
11
12
13
14
15
16
17
18
19
2
20
3
4
5
6
7
8
9
有没有不保存到文件的更方便的方法?您可以迭代从1到20的数字,然后使用正则表达式将每个数字与
a
进行比较:
a='1 2 3 5 6 11 18'
for i in {1..20}; do
re="\\b$i\\b"
[[ "$a" =~ $re ]] || echo "$i"
done
正则表达式非常简单:\b
是a,$i
被扩展为1,2,…,20
上面将打印所有不在
a
中的数字。您可以迭代从1到20的数字,然后使用正则表达式将每个数字与a
进行比较:
a='1 2 3 5 6 11 18'
for i in {1..20}; do
re="\\b$i\\b"
[[ "$a" =~ $re ]] || echo "$i"
done
正则表达式非常简单:\b
是a,$i
被扩展为1,2,…,20
上面将打印所有不在
a
:comm^^中的数字,也就是说,可以轻松编写纯bash变体:a='1 2 3 5 6 11 18';以美元计算的x;t[$x]=1;完成;为了((x=1;xThanks@anishsane。但是第二个输出空行。第一个需要sort
1234…10…20
不被视为已排序,但是11011…2203…
会被视为已排序。^^^我的错…对于第一个,使用sort-un
而不仅仅是sort-u
:commnt可以很容易地编写:a='1 2 3 5 6 11 18';for x in$a;do t[$x]=1;done;for((x=1;xThanks@anishsane。但是第二个输出空行。第一个需要sort
1234…10…20
不被视为已排序,但是11011…2203…
可以。^^我的错…对于第一个,使用sort-un
而不是sort-u
Hi@andlrc它可以工作,但我不知道为什么有两个back睫毛不只是一个?为什么理论上,[[[$a”=~“\\b$i\\b”].\124; echo“$i”
不起作用“\b”
应该起作用,但既然反斜杠是一个转义字符,我们需要转义它:\\b
-\b
,或者用单引号将其引起来:'\b'$i'\b'
。为什么[$a=“\\\\b\\i\\b”]
不起作用:这似乎是bash中的一个bug,这里有一个解释:Hi@andlrc它起作用了,但我不知道为什么两个反斜杠不只是一个?为什么[[$a”=~“\\b$I\\b”].\124; echo“$I”
在理论上不起作用“\b”
应该可以工作,但由于反斜杠是一个转义字符,我们需要对其进行转义:\\b
->\b
,或者将其放在单引号中:'\b'$i'''\b'
。对于为什么[[“$a”=~“\\b$i\\b”]]
不起作用:这似乎是bash中的一个bug,这里有一个解释: