我想动态打印属性文件中的值我正在使用下面的代码但得到错误的输出。
testProperty.properties
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 看不到 shell 变量。 awk 认为您指的是 awk 变量i
。该变量未定义,因此在数字上下文中它的值为零。因此$i
awk 将其解释为$0
或整行。
您需要将 shell 变量传递给 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
,awk
因此将按字面意思看到,$($i)
而不是$1
如第二个示例中给出的那样。
您可以使用该选项将变量赋予 awk -v
。
也许awk
不是完成这项工作的完美工具。我可能会简单地使用
perl -wnle 'print for split ","'