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

答え2

あなたはを使用していますabc=$(awk -F "," '(NR==1){print $($i)}' $file)。ここでは、awkスクリプトの周りに一重引用符を使用します。したがって、同様の変数は$iその値に置き換えられません。

したがって、i=12番目の例では提供されていませんが、awk文字通り表示されます。$($i)$1

このオプションを使用して、awkに変数を割り当てることができます-v

たぶん、あなたawkの仕事に最適なツールではないかもしれません。私は単に使用することができます

perl -wnle 'print for split ","'

関連情報