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

Pet*_*ier 7 csv bash awk replace sed

假设我有一个字符串

"1,2,3,4"
Run Code Online (Sandbox Code Playgroud)

现在我想用一些不同的值替换,例如字符串的第3个字段.

"1,2,NEW,4"
Run Code Online (Sandbox Code Playgroud)

我设法使用以下命令执行此操作:

echo "1,2,3,4" | awk -F, -v OFS=, '{$3="NEW"; print }'
Run Code Online (Sandbox Code Playgroud)

现在要替换的列的索引应该作为变量传递.所以在这种情况下

index=3
Run Code Online (Sandbox Code Playgroud)

我怎么能把这个传递给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 }'
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Jen*_*ens 6

让shell在awk程序中插入索引:

echo "1,2,3,4" | awk -F, -v OFS=, '{$'$index'="NEW"; print }'
Run Code Online (Sandbox Code Playgroud)

请注意原始单引号awk程序如何分为三部分,单引号开头'{$',插值索引值,后跟程序的单引号余数.


pot*_*ong 5

这可能对你有用:

index=3 
echo "1,2,3,4" | awk -F, -v OFS=, -v INDEX=$index '{$INDEX="NEW"; print }'
Run Code Online (Sandbox Code Playgroud)

要么:

index=3 
echo "1,2,3,4" | sed 's/[^,]*/NEW/'$index
Run Code Online (Sandbox Code Playgroud)