ループの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
パイプしたりする必要はありません。)stdout
wc
- あなたはいつも、いつも、いつも引用するみんなトークン化とワイルドカードの影響を受けない限り、変数の置き換え。私の言葉はunqoutedです
${file1_dom}
。また、作成する必要はありません${file1_dom}
。$file1_dom
これは優先されます(${...}構文は異なる利点を提供しますが、ここでは必要ありません)。 - 同様に
-eu
、スクリプトにソルバーを追加して常に一般的なスクリプトエラーを防ぐ必要があります。 [[
単純な数値比較に使用する必要はなく、[
十分です。- エラーはおそらく比較にあります。
${j} -gt ${m}
はバックティックで囲まれているため、サブシェルで実行されるため、値はj
コマンド名として扱われます。 (ニュースが出てくるところです。) 似たようなことをしたい場合は、上記if [ "$j" -gt "$m" ]; then ...
のすべてのルールを適用してください。
これらの規則に従ってスクリプトを再構築することを選択した場合は、正しいスクリプトがどのような影響を与えるかを他の人が見るために元の投稿に追加してください。