bash shellscript for 循环两个变量,输入来自两个文件
我有一个文件1:
我需要将文件 2 中的已用内存(列 5)与文件 1 中的可用内存(列 4)进行比较。如果文件 1 中的可用内存(列 4)大于文件 2 中的已用内存(列 5)。输出应该是 file2 中的 VM(column2),可以重新定位到 file1 中的存储(column1)。文件按降序排序
storage,totalmem,usedmem,freemem
0843,524230,241374,282856
0867,524230,253339,270891
0842,524230,291427,232803
0868,262086,48660,213426
0849,524230,335445,188785
0844,524230,335446,188784
0860,524230,354981,169249
0855,524230,354984,169246
0862,524230,354985,169245
0853,524230,354986,169244
0850,524230,411733,112497
0857,524230,411734,112496
0841,524230,411734,112496
0839,524230,411735,112495
0848,524230,411736,112494
0851,524230,411737,112493
文件2
storage, vm ,rack,usedcpu,usedmem,type
0839,x0aaa05,US1 DA12,4,78851,FA
0839,x0aaa01,US1 DA12,5,10243,OIM
0839,x0aaa03,US1 DA12,6,4099,OHS
期望的输出 -
significant memory does not exist in 0843 to relocate x0aaa06
x0aaa05 can be relocated to 0867
x0aaa01 can be relocated to 0842
x0aaa03 can be relocated to 0868
我一直在尝试使用 for 循环来传递类似的东西
for i in `cat file2|wc -l`
do
j=`cat file1|cut -d, -f4`
m=`cat file2|cut -d, -f5`
file1_dom=`cat file1|cut -d, -f1`
file2_vm=`cat file2|cut -d, -f2`
if [[ `${j} -gt ${m}` ]]
then
echo ${file2_vm} can be reclocated to ${file1_dom}
fi
done
输出 - 错误输出
-bash: 282856: command not found
示例2-
set -- $( cat file1|cut -d, -f4 )
for i in `cat file2|cut -d, -f5`
do
if [[ $1 -gt $i ]]
then
echo $1 can be relocated to $i
fi
done
输出 -
282856 can be relocated to 78851
282856 can be relocated to 10243
282856 can be relocated to 4099
答案1
for i in `cat file2|wc -l`
do
j=`cat file1|cut -d, -f4`
m=`cat file2|cut -d, -f5`
file1_dom=`cat file1|cut -d, -f1`
file2_vm=`cat file2|cut -d, -f2`
if [[ `${j} -gt ${m}` ]]
then
echo ${file2_vm} can be reclocated to ${file1_dom}
fi
done
我在您的代码片段中发现了几个问题:
- 不要使用反引号来启动子 shell,它们已经被弃用了一段时间。更喜欢
$(cmd)
语法。 cat file2 | wc -l
例如就不用写了,wc -l file2
更短,效率更高。 (无需启动cat
、将其通过管道传输stdout
至wc
等)- 你应该永远、永远、总是引用全部变量替换,除非您希望它们受到分词和通配符的影响。我指的是 unqouted
${file1_dom}
。另外,没有必要写${file1_dom}
,$file1_dom
是首选( ${...} 语法提供了一些其他的好处,但这里是不必要的)。 - 同样,您应该始终通过添加
-eu
到脚本的解释器行 (shebang) 来防止常见的脚本错误。 - 不需要用于
[[
简单的数值比较,[
就足够了。 - 该错误可能是在比较中:
${j} -gt ${m}
被反引号包围,因此在子 shell 中执行,因此 的值j
被视为命令名称。 (这就是消息的来源。)您想要类似的东西if [ "$j" -gt "$m" ]; then ...
,应用上面的所有规则。
如果您选择根据这些规则重写您的脚本,请将其添加到您的原始帖子中,以便其他人可以从看到正确的脚本产生的影响中受益。