배열에 사용하기 위해 문자열 값을 인덱스 값으로 변경하는 방법은 무엇입니까?

배열에 사용하기 위해 문자열 값을 인덱스 값으로 변경하는 방법은 무엇입니까?

배열에 사용하기 위해 문자열을 인덱스로 변경하려고 시도했지만 작동하지 않습니다.

이건 내 파일이야

$ cat file1.txt
101,Harish,BAN
102,Srinu,HYD

이 코드는:

#!/bin/bash
IFS=','
while read line
do
    DELIM_REMOVE=`echo $line|sed 's/,/ /g'`
    V=($DEL_REMOVE)
    echo ${DELIM_REMOVE}
        for i in "${!V[@]}"; do
            printf 'V[%s] = %s\n' "$i" "${V[i]}"
                echo "${V[i]}"
        done
done < /home/ec2-user/file1.txt
echo "${V[i]}"

또한 다른 루프에서 동적으로 생성된 변수를 사용해야 합니다.

답변1

텍스트를 처리하기 위해 쉘 루프를 사용하지 마십시오, 텍스트 처리 유틸리티를 사용합니다.

awk -F, '{for (i = 0; i < NF; i++) printf "v[%d] = %s\n", i, $(i+1)}' < file1.txt

만약 너라면가지다루프를 사용하면 bash다음과 같이 작성하는 것이 더 합리적입니다.

while IFS=, read -ra v; do
  for i in "${!v[@]}"; do
    printf 'v[%d] = %s\n' "$i" "${v[i]}"
  done
done < file1.txt

알아두어야 할 것은마지막 필드가 비어 있으면 건너뜁니다..

답변2

스크립트에 몇 가지 문제가 있습니다.

  • 변수 이름은 다음과 V=($DEL_REMOVE)같아야 합니다.V=($DELIM_REMOVE)
  • ,IFS를 쉼표( ) 로 설정했지만 제거 쉼표를 사용합니다 sed.

이 두 가지 사항을 변경하면 스크립트가 몇 가지 합리적인 작업을 수행하기 시작합니다.

몇 가지 다른 변경사항을 적용하면 스크립트는 다음과 같이 됩니다.

#!/bin/bash

IFS=' '                           # Use the space to split
set -f                            # Avoid globing of values with *,? or []
while read -r line                # read the variable without removing backslash
do
    v=( ${line//,/ } )            # Convert to an array by splitting with the shell.
    for i in "${!v[@]}"; do
            printf 'v[%s] = %s\n' "$i" "${v[i]}"
        done
done < file1.txt

다음을 인쇄합니다:

v[0] = 101
v[1] = Harish
v[2] = BAN
v[0] = 102
v[1] = Srinu
v[2] = HYD

이것이 당신이 기대했던 것입니까?

관련 정보