bash shellscript for 循环两个变量,输入来自两个文件

bash shellscript for 循环两个变量,输入来自两个文件

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、将其通过管道传输stdoutwc等)
  • 你应该永远、永远、总是引用全部变量替换,除非您希望它们受到分词和通配符的影响。我指的是 unqouted ${file1_dom}。另外,没有必要写${file1_dom},$file1_dom是首选( ${...} 语法提供了一些其他的好处,但这里是不必要的)。
  • 同样,您应该始终通过添加-eu到脚本的解释器行 (shebang) 来防止常见的脚本错误。
  • 不需要用于[[简单的数值比较,[就足够了。
  • 该错误可能是在比较中:${j} -gt ${m}被反引号包围,因此在子 shell 中执行,因此 的值j被视为命令名称。 (这就是消息的来源。)您想要类似的东西if [ "$j" -gt "$m" ]; then ...,应用上面的所有规则。

如果您选择根据这些规则重写您的脚本,请将其添加到您的原始帖子中,以便其他人可以从看到正确的脚本产生的影响中受益。

相关内容