如何将字符串值更改为索引值以在数组中使用?

如何将字符串值更改为索引值以在数组中使用?

我尝试将字符串更改为索引以用于数组,但我无法让它工作。

这是我的文件

$ 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

这是你所期望的吗?

相关内容