我有一个包含以下内容的文件:-
2
4
5
并且有范围,比如 1 到 5 。我需要一个输出为 1,3 的 shell 脚本。这是文件中不存在且不在范围内的数字。
我该怎么办?
答案1
comm -13 <(sort file) <(seq 1 5 | sort) | sort -n
该comm
命令报告(按词法)排序的文件之间的公共行。如果没有任何选项,它会给出三列:
- 仅在第一个文件中找到的行
- 仅在第二个文件中找到的行
- 两个文件共有的行。
您可以传递-1
, -2
,-3
选项来抑制相应的列。所以-13
离开<(seq 1 5 | sort)
仅在输出中找到的行。
答案2
你可以通过以下方式完成任务grep
seq 5 | fgrep -vxf <(tr ' ' '\n' < file)
tr
将文件字符串转换为一个数字在线输出<()
命令替换(命令的输出读取为文件)-f
选项grep
意味着模式将从文件中读取-x
选项表示“匹配整行”,例如1
将不匹配11
或21
-v
选项反向模式匹配seq
1
生成从(默认省略)到以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