ループのbashシェルスクリプトは2つの変数、入力は2つのファイルから来ます。

ループのbashシェルスクリプトは2つの変数、入力は2つのファイルから来ます。

ループのbashシェルスクリプトは2つの変数、入力は2つのファイルから来ます。

ファイル1があります。

ファイル2(列5)の使用済みメモリーとファイル1(列4)の使用可能なメモリーを比較する必要があります。ファイル1(列4)の空きメモリーがファイル2(列5)で使用されているメモリーよりも大きい場合。出力は、file1のストレージ(column1)に再配置できるfile2のVM(column2)でなければなりません。ファイルを降順に並べ替える

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    

あなたのコードスニペットにいくつかの問題があります。

  • サブシェルを開始するためにバックティックを使用しないでください。バックティックはしばらく使用されなくなりました。文法を好みます$(cmd)
  • cat file2 | wc -lたとえば、作成する必要はなく、wc -l file2短くて効率的です。 (起動したりcatパイプしたりする必要はありません。)stdoutwc
  • あなたはいつも、いつも、いつも引用するみんなトークン化とワイルドカードの影響を受けない限り、変数の置き換え。私の言葉はunqoutedです${file1_dom}。また、作成する必要はありません${file1_dom}$file1_domこれは優先されます(${...}構文は異なる利点を提供しますが、ここでは必要ありません)。
  • 同様に-eu、スクリプトにソルバーを追加して常に一般的なスクリプトエラーを防ぐ必要があります。
  • [[単純な数値比較に使用する必要はなく、[十分です。
  • エラーはおそらく比較にあります。${j} -gt ${m}はバックティックで囲まれているため、サブシェルで実行されるため、値はjコマンド名として扱われます。 (ニュースが出てくるところです。) 似たようなことをしたい場合は、上記if [ "$j" -gt "$m" ]; then ...のすべてのルールを適用してください。

これらの規則に従ってスクリプトを再構築することを選択した場合は、正しいスクリプトがどのような影響を与えるかを他の人が見るために元の投稿に追加してください。

おすすめ記事