假设我有一个字符串
"1,2,3,4"
现在我要替换,例如字符串的第3个字段有一些不同的值。
"1,2,NEW,4"
我设法使用以下命令执行此操作:
echo "1,2,3,4" | awk -F, -v OFS=, '{$3="NEW"; print }'
现在要替换的列的索引应该作为变量传递。所以在这种情况下
index=3
如何将此传递给awk?因为这不起作用:
echo "1,2,3,4" | awk -F, -v OFS=, '{$index="NEW"; print }'
echo "1,2,3,4" | awk -F, -v OFS=, '{$($index)="NEW"; print }'
echo "1,2,3,4" | awk -F, -v OFS=, '{\$$index="NEW"; print }'
感谢您的帮助!
答案 0 :(得分:6)
让shell在awk程序中插入索引:
echo "1,2,3,4" | awk -F, -v OFS=, '{$'$index'="NEW"; print }'
请注意原始单引号awk程序如何分为三部分,单引号开头'{$',插值索引值,后跟程序的单引号。
答案 1 :(得分:5)
这可能对您有用:
index=3
echo "1,2,3,4" | awk -F, -v OFS=, -v INDEX=$index '{$INDEX="NEW"; print }'
或:
index=3
echo "1,2,3,4" | sed 's/[^,]*/NEW/'$index
答案 2 :(得分:2)
这是打破sed
病区的awk
方法:
$ echo "1,2,3,4" | sed 's/,/\n/g' | sed -e $index's/.*/NEW/'
只需添加另一个-e $newindex's/.*/NEWNEW/'
答案 3 :(得分:0)
# This should be faster than awk or sed.
str="1,2,3,4"
IFS=','
read -a f <<< "$str"
f[2]='NEW'
printf "${f[*]}"
答案 4 :(得分:-1)
使用普通awk(IE非gawk等)我相信你必须使用split( string, array, [fieldsep] );
更改所选的数组条目,然后将它们与sprintf
或类似的循环连接在一起。< / p>
gawk允许您在示例中将变量作为字段名称$ index。见here.
gawk通常是Linux上的默认awk,所以将你的调用更改为gawk“script”,看它是否有效。