我有两个变量:
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 变量作为awk
awk 变量提供,例如使用-v
:
awk -F , -v OFS=, -v new="$var" '{$3=new; print}' <<<"$out"
shell 变量以 的形式$var
提供。在 awk 程序中,用于引用此变量。awk 的输出字段分隔符 ( ) 也可以这样设置。awk
new
new
OFS
- 请注意,使用此方法,
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}"