ksh에서 문자열 배열을 필터링하는 방법

ksh에서 문자열 배열을 필터링하는 방법

"aa" 배열에서 "bb" 배열에 정의된 IP를 제거하여 IP가255.0.0.0그리고255.255.255.0목록에서 제거됩니다대량으로.

ksh 코드를 실행하고 나중에 aa 배열을 인쇄하면 IP가 표시됩니다.255.255.255.0삭제되지 않았나요?

내 문법에 무슨 문제가 있나요?

   echo ${aa[*]}
   45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12


   echo ${bb[*]}
   255.0.0.0 255.255.255.0

KSH 프로그램:

  for run in  ${bb[*]}
  do
   for ((i=0; i<${#aa[@]}; i++)); do
   [[ ${aa[i]} == $run ]] && unset aa[i]
   done
  done

시험:

 echo ${aa[*]}
   45.32.3.5 255.255.255.0 19.23.2.12                  

노트:255.255.255.0은 위 목록에서 제거되어야 합니다.

답변1

귀하의 코드가 제공된 입력으로 작동하지 않는 이유를 모르겠습니다. 내 시스템에서는 ksh로 실행됩니다.

그러나 원본 코드에는 문제가 있습니다. 조건부 부분은 i<${#aa[@]}깨지기 쉽습니다. 즉 ${#aa[@]}, 배열 크기는 매번 감소 unset하지만 다음 배열 요소는 자동으로 왼쪽으로 이동하지 않습니다. 귀하의 예를 들어

45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12

이것은 변화를 가져오지 않을 것입니다 – 그러나 그것은 변화를 가져올 것입니다 – 다음과 같이 말하십시오:

45.32.3.5 255.0.0.0 19.23.2.12 255.255.255.0

나는 이 문제에 대한 코드를 개선했습니다(루프 항목 이전의 할당에 유의하십시오). 또한 내부 루프(연관 배열 사용)를 제거하여 실행 시간을 2차에서 선형으로 개선했습니다.

$ cat x.sh

그것을 출력하십시오:

aa=(45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12)
bb=([255.0.0.0]=1 [255.255.255.0]=1)

print Size of input ${#aa[*]}
print Size of exclude list ${#bb[*]}

n=${#aa[*]}
for ((i=0; i<$n; ++i))
do
  if [[ ${bb[${aa[i]}]} ]]
  then
    print Removing element with index $i: ${aa[i]}
    unset aa[i];
  fi
  print New size of input ${#aa[*]}
done

print Resulting size of input ${#aa[*]}
print Resulting elements ${aa[*]}

for ((i=0; i<$n; ++i))
do
  print Index $i, Value 'a['$i']'=${aa[$i]}
done

Fedora 17에서는 다음과 같은 출력이 생성됩니다.

$ ksh x.sh
Size of input 4
Size of exclude list 2
New size of input 4
Removing element with index 1: 255.0.0.0
New size of input 3
Removing element with index 2: 255.255.255.0
New size of input 2
New size of input 2
Resulting size of input 2
Resulting elements 45.32.3.5 19.23.2.12
Index 0, Value a[0]=45.32.3.5
Index 1, Value a[1]=
Index 2, Value a[2]=
Index 3, Value a[3]=19.23.2.12

관련 정보