我想动态打印 csv 文件中的值

我想动态打印 csv 文件中的值

我想动态打印属性文件中的值我正在使用下面的代码但得到错误的输出。

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。该变量未定义,因此在数字上下文中它的值为零。因此$iawk 将其解释为$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=1awk因此将按字面意思看到,$($i)而不是$1如第二个示例中给出的那样。

您可以使用该选项将变量赋予 awk -v

也许awk不是完成这项工作的完美工具。我可能会简单地使用

perl -wnle 'print for split ","'

相关内容