LTM
LTM

Reputation: 557

Change column if some regex expression is true with awk or sed

I have a file (lets call it data.csv) similar to this

"123","456","ud,h-match","moredata"

with many rows in the same format and embedded commas. What I need to do is look at the third column and see if it has an expression. In this case I want to know if the third column has "match" anywhere (which it does). If there is any, then I to replace the whole column to something else like "replaced". So to relate it to the example data.csv file, I would want it to look this.

"123","456","replaced","moredata"

Ideally, I want the file data.csv itself to be changed (time is of the essence since I have a big file) but it's also fine if you write it to another file.

Edit:

I have tried using awk:

awk -F'","' -OFS="," '{if(tolower($3) ~ "stringI'mSearchingFor"){$3="replacement"; print}else print}' file

but it dosen't change anything. If I remove the OFS portion then it works but it gets separated by spaces and the columns don't get enclosed by double quotes.

Upvotes: 0

Views: 108

Answers (1)

Ed Morton
Ed Morton

Reputation: 203522

Depending on the answer to my question about what you mean by column, this may be what you want (uses GNU awk for FPAT):

$ awk -v FPAT='[^,]+|"[^"]+"' -v OFS=',' '$3~/match/{$3="\"replaced\""} 1' file
"123","456","replaced","moredata"

Use awk -i inplace ... if you want to do "in place" editing.

With any awk (but slightly more fragile than the above since it leaves the leading/trailing " on the first and last fields, and has no -i inplace):

$ awk 'BEGIN{FS=OFS="\",\""} $3~/match/{$3="replaced"} 1' file
"123","456","replaced","moredata"

Upvotes: 1

Related Questions