检查另一个文件中的一组两个数字之间是否存在一个数字,并在 shell 脚本中相应地输出 return

Check if a number exists in between a set of two numbers in another file and return output accordingly in a shell script

要详细说明问题,请参阅我的确切需求描述:

输入文件 1 的内容(input1.txt):

1
5
7
11

输入文件 2 的内容(input2.txt):

3
9

现在,我需要一个循环,它转到第一个输入文件,获取前两个元素(即 1 和 5),然后检查第二个文件中是否有介于 5 和 7 之间的任何数字。在这种情况下,有一个数字(即 3 )所以它 returns 'good' 并且在第二次迭代中,它从第一个输入中获取(5 和 7)与第二个文件中的列表进行比较,并且这次没有匹配,应该 return 'bad'.

预期输出:

good
bad
good

我编写了一个代码,能够以两个为一组读取第一个文件的输入。 因此,我能够在循环中读取 1 和 5、5 和 7 等等,但我无法找到合适的代码来比较整个 input2 文件和 return 输出之间的任何数字。

last=`wc -l input1.txt|awk -F ' ' '{printf }'`
for ((i=1;i<$last;i++))
do 
x=$i
y=`expr $x+1`
a=`sed -n "${x}p" input1.txt`
b=`sed -n "${y}p" input1.txt`
#code is working correctly till above line
while read line
if [ "$a" -le "$line" ]&&[ "$b" -le "$line" ]; then
echo "good" >> output.txt
else
echo "bad" >> output.txt
fi
done < input2.txt
done

此代码的输出是:

good
bad
bad
bad
bad
good

awk

awk '
    NR==FNR {v2[]; next} 
    FNR>1 {
        result="bad"
        for (v in v2) 
            if (0+prev < 0+v && 0+v < 0+) {result="good"; break}
        print result
    } 
    {prev=[=10=]}
' input2.txt  input1.txt

需要 0+variable 来强制进行数字比较,否则 awk 认为字符串“9”在字典序上大于字符串“11”。

bash,同理。使用 (( ... ))

强制执行数字比较
v1=( $(<input1.txt) )
v2=( $(<input2.txt) )
for ((i=1; i<${#v1[@]}; i++)); do 
    result=bad
    for v in "${v2[@]}"; do 
        if (( ${v1[i-1]} < v && v < ${v1[i]} )); then 
            result=good
            break
        fi
    done
echo $result
done   

Ruby 简洁明了。这里也必须小心,我们将值视为整数,而不是字符串

ruby -e '
  v1 = File.readlines(ARGV.shift).collect {|line| line.to_i}
  v2 = File.readlines(ARGV.shift).collect {|line| line.to_i}
  v1.each_cons(2) {|(a,b)| puts v2.any? {|v| a<v && v<b} ? "good" : "bad"}
' input1.txt input2.txt