输入文件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
答案 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;。
(( ... ))
强制执行数字比较
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