查找不在某个范围内的所有数字

查找不在某个范围内的所有数字

我有一个包含以下内容的文件:-

2
4
5

并且有范围,比如 1 到 5 。我需要一个输出为 1,3 的 shell 脚本。这是文件中不存在且不在范围内的数字。

我该怎么办?

答案1

comm -13 <(sort file) <(seq 1 5 | sort) | sort -n

comm命令报告(按词法)排序的文件之间的公共行。如果没有任何选项,它会给出三列:

  1. 仅在第一个文件中找到的行
  2. 仅在第二个文件中找到的行
  3. 两个文件共有的行。

您可以传递-1, -2,-3选项来抑制相应的列。所以-13离开<(seq 1 5 | sort)仅在输出中找到的行

答案2

你可以通过以下方式完成任务grep

seq 5 | fgrep -vxf <(tr ' ' '\n' < file)
  • tr将文件字符串转换为一个数字在线输出
  • <()命令替换(命令的输出读取为文件)
  • -f选项grep意味着模式将从文件中读取
  • -x选项表示“匹配整行”,例如1将不匹配1121
  • -v选项反向模式匹配
  • seq1生成从(默认省略)到以5换行符分隔的数字列表

编辑:如果您的文件已经包含 1 个数字 x 1 行,您可以省略tr

seq 5 | fgrep -vxf file

答案3

一个示例(并不完美)解决方案如下所示:

for i in `seq 1 5`
do
flag=1
for j in `cat filename_with_numbers`
do
if [ $i -eq $j ]
then flag=0
fi
done
if [ $flag -eq 1 ]
then echo $i
fi
done

答案4

#!/bin/sh
#make a range of numbers
range=$(seq -s' ' 5)
#make a copy of range
tmp_range=$range
#loop the content
for i in $(echo 2 4 5)
do
  #loop the range
  for j in $range
  do
    if [ $i -eq $j ]
    then
        #delete in the copy if match
        tmp_range=$(echo $tmp_range|sed "s/$i//")
        #exit this loop and continue the first loop if match
        continue 2
    fi
  done
done
echo $tmp_range

相关内容