如何使用 awk 将变量中的列值替换为变量

如何使用 awk 将变量中的列值替换为变量

我有两个变量:

var=x
out=1,2,3,4,5

我想用 $var 替换 $out 中的第三列。我可以使用以下命令将第 3 列中的 x 替换为 3(我之所以提到 $out 中的列,是因为这些列将是数据库插入语句的值):

echo $out | awk -F ',' -v new=, '{$3="x" ; print}'

输出为:

1 2 x 4 5

但是,使用以下命令使用 $var 代替 x 不起作用:

echo $out | awk -F ',' -v new=, '{$3=$var; print}'

输出为:

1 2 1,2,3,4,5 4 5

最后一个问题是输出不是以逗号分隔的。因此,我试图实现以下输出:

1,2,x,4,5

其中 x 是 $var 的当前值。有人知道如何做到这一点吗?

答案1

一种选择是将 shell 变量作为awkawk 变量提供,例如使用-v

awk -F , -v OFS=, -v new="$var" '{$3=new; print}' <<<"$out"

shell 变量以 的形式$var提供。在 awk 程序中,用于引用此变量。awk 的输出字段分隔符 ( ) 也可以这样设置。awknewnewOFS

  • 请注意,使用此方法,awk将把反斜杠解释$var为转义序列。为了避免这种情况,您可以将 shell 变量放在 awk 的环境中,并通过数组在 awk 程序中访问ENVIRON
new="$var" awk -F , -v OFS=, '{$3=ENVIRON["new"]; print}' <<<"$out"

在 shell 中,通常最好引用参数扩展(例如"$var"),否则扩展将受文件名生成的影响(又名通配符)和IFS字段分裂。

答案2

您的问题是使用时'无法扩展 shell 变量,因此必须使用"

但如果你开始使用," 你必须通过\

解决方案是:

echo $out | awk -F ',' -v new=, "{\$3=\"$var\" ; print}"

相关内容