我尝试将字符串更改为索引以用于数组,但我无法让它工作。
这是我的文件
$ 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
不要使用 shell 循环来处理文本,使用文本处理实用程序。
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
这是你所期望的吗?