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

时间:2015-01-27 10:30:16

标签: shell unix scripting

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

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

1
5
7
11

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

3
9

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

预期产出:

good
bad
good

我编写的代码能够以两个为一组读取第一个文件的输入。 所以,我能够在循环中读取1和5,5和7等等但是我无法找到一个适当的代码来比较整个input2文件中的任何数字并相应地返回输出。

last=`wc -l input1.txt|awk -F ' ' '{printf $1}'`
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

1 个答案:

答案 0 :(得分:0)

AWK

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

强制数字比较需要0+variable,否则awk会考虑字符串&#34; 9&#34;按字典顺序大于字符串&#34; 11&#34;。

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