배열에 사용하기 위해 문자열을 인덱스로 변경하려고 시도했지만 작동하지 않습니다.
이건 내 파일이야
$ 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
이것이 당신이 기대했던 것입니까?