csvファイルの値を動的に印刷したいです。

csvファイルの値を動的に印刷したいです。

以下のコードを使用していますが、間違った出力が表示されるプロパティファイルの値を動的に印刷したいと思います。

テスト属性、属性

edmcws,edmbws,edmwt

パスワード

file=/ThreadDump/testProperty.properties

count=$(head -1 $file | sed 's/[^,]//g' | wc -c)
echo "$count"

for((i=1;i<=$count;i++))
do
abc=$(awk -F "," '(NR==1){print $($i)}' $file)

echo "$abc"
done

出力

3
edmcws,edmbws,edmwt
edmcws,edmbws,edmwt
edmcws,edmbws,edmwt

ただし、値をハードコーディングすると正しい出力が得られます。

パスワード

file=/ThreadDump/testProperty.properties

count=$(head -1 $file | sed 's/[^,]//g' | wc -c)
echo "$count"

for((i=1;i<=$count;i++))
do
abc=$(awk -F "," '(NR==1){print $1}' $file)

echo "$abc"
done

出力

3
edmcws
edmcws
edmcws

ベストアンサー1

awk本文は一重引用符で囲まれているため、awkはシェル変数を表示できません。 awkはawk変数を意味すると思いますi。変数が定義されていないため、数値コンテキストでは、対応する値はゼロです。だから$iawkはそれをまた$0は全体の行として解釈します。

awkにシェル変数を渡す必要があります。

for ((i=1; i<=$count; i++))
do
    abc=$(awk -F "," -v col=$i 'NR==1 {print $col}' $file)
    #................^^^^^^^^^...............^^^^
    echo "$abc"
done

しかし、awkを個別に3回呼び出すよりも良い方法があります。

while IFS=, read -ra fields; do
    printf "%s\n" "${fields[@]}"
    # or do stuff with the individual fields
    for ((i=0; i < ${#fields[@]}; i++)); do
        echo "${fields[i]}"
    done
done < "$file" 
  • ループwhile、ファイルの内容をそのファイルにリダイレクトし、ファイル行を繰り返します。
  • IFS=,readコマンドをカンマで区切るように指示します。
  • read -r特殊文字が一般文字以外の文字として解釈されないことを意味します。
  • read -a fields行の単語を配列変数という名前で読み込みます。fields

おすすめ記事