루프에 대한 bash 쉘 스크립트는 두 개의 변수, 입력은 두 개의 파일에서 나옵니다.

루프에 대한 bash 쉘 스크립트는 두 개의 변수, 입력은 두 개의 파일에서 나옵니다.

루프에 대한 bash 쉘 스크립트는 두 개의 변수, 입력은 두 개의 파일에서 나옵니다.

파일 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스크립트에 해석기 줄(shebang)을 추가하여 항상 일반적인 스크립트 오류를 ​​방지해야 합니다.
  • [[단순한 수치비교 에 사용할 필요는 없으며 , [충분합니다.
  • 오류는 아마도 비교에 있을 것입니다. ${j} -gt ${m}는 백틱으로 둘러싸여 있으므로 하위 쉘에서 실행되므로 값이 j명령 이름으로 처리됩니다. (뉴스가 나오는 곳입니다.) 비슷한 것을 원하면 if [ "$j" -gt "$m" ]; then ...위의 모든 규칙을 적용하십시오.

이러한 규칙에 따라 스크립트를 다시 작성하기로 선택한 경우, 올바른 스크립트가 미칠 수 있는 영향을 다른 사람들이 볼 수 있도록 원본 게시물에 추가하세요.

관련 정보