配列で使用するために文字列をインデックスに変更しようとしましたが、機能しません。
これは私のファイルです。
$ 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
これはあなたが期待したものですか?