以下のコードを使用していますが、間違った出力が表示されるプロパティファイルの値を動的に印刷したいと思います。
テスト属性、属性
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
。変数が定義されていないため、数値コンテキストでは、対応する値はゼロです。だから$i
awkはそれをまた$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=1
2番目の例では提供されていませんが、awk
文字通り表示されます。$($i)
$1
このオプションを使用して、awkに変数を割り当てることができます-v
。
たぶん、あなたawk
の仕事に最適なツールではないかもしれません。私は単に使用することができます
perl -wnle 'print for split ","'