配列で使用するために文字列値をインデックス値に変更するには?

配列で使用するために文字列値をインデックス値に変更するには?

配列で使用するために文字列をインデックスに変更しようとしましたが、機能しません。

これは私のファイルです。

$ 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

これら2つの変更を加えると、スクリプトはいくつかの合理的なタスクを実行し始めます。

いくつかの他の変更を適用すると、スクリプトは次のようになります。

#!/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

これはあなたが期待したものですか?

関連情報