How to replace the nth column/field in a comma-separated string using sed/awk?

38,806

Solution 1

Have the shell interpolate the index in the awk program:

echo "1,2,3,4" | awk -F, -v OFS=, '{$'$index'="NEW"; print }'

Note how the originally single quoted awk program is split in three parts, a single quoted beginning '{$', the interpolated index value, followed by the single quoted remainder of the program.

Solution 2

This might work for you:

index=3 
echo "1,2,3,4" | awk -F, -v OFS=, -v INDEX=$index '{$INDEX="NEW"; print }'

or:

index=3 
echo "1,2,3,4" | sed 's/[^,]*/NEW/'$index

Solution 3

Here's a seductive way to break the awkwardness:

$ echo "1,2,3,4" | sed 's/,/\n/g' | sed -e $index's/.*/NEW/'

This is easily extendable to multiple indexes just by adding another -e $newindex's/.*/NEWNEW/'

Share:
38,806
Peter Meier
Author by

Peter Meier

Updated on August 04, 2022

Comments

  • Peter Meier
    Peter Meier over 1 year

    assume I have a string

    "1,2,3,4"
    

    Now I want to replace, e.g. the 3rd field of the string by some different value.

    "1,2,NEW,4"
    

    I managed to do this with the following command:

    echo "1,2,3,4" | awk -F, -v OFS=, '{$3="NEW"; print }'
    

    Now the index for the column to be replaced should be passed as a variable. So in this case

    index=3
    

    How can I pass this to awk? Because this won't work:

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

    Thanks for your help!