如何使用sed / awk替换逗号分隔的字符串中的第n列/字段?

时间:2012-03-23 11:07:00

标签: bash replace sed awk csv

假设我有一个字符串

"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 }'

感谢您的帮助!

5 个答案:

答案 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”,看它是否有效。