Как установить значение для столбца, если подстрока появляется в любом месте строки в CSV? - PullRequest
3 голосов
/ 10 мая 2019

У меня есть CSV-файл, в котором есть такие записи:

id,name,status,taglist
1,nobody,closed,"something,something else,rambling,blah,No Show,blah"
2,quitter,closed,"something,stuff,nonsense,blah"
3,somebody,accepted,"something,more stuff,sure thing,blah"

Когда в столбце списка тегов появляется «не показывать», мне нужно изменить «закрыто» на «не показывать» в столбце состояния. Я могу найти такие строки, как эта:

awk '/No Show/' < myfile.csv > noshowsonly.csv

Но я не могу понять, как обновить только столбец состояния, чтобы результат выглядел так:

id,name,status,taglist
1,nobody,No Show,"something,something else,rambling,blah,No Show,blah"
2,quitter,closed,"something,stuff,nonsense,blah"
3,somebody,accepted,"something,more stuff,sure thing,blah"

Я пробовал строки вроде:

awk '{if($4 ~ /No Show/) { $3="No Show"}}1' < myfile.csv > updated.csv

Но это не работает, и я в тупике.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

С GNU awk для FPAT и при условии, что вы действительно хотите проверить только 4-е поле, а не всю строку:

$ awk -v FPAT='([^,]*)|("[^"]*")' -v OFS=',' '$4 ~ /No Show/{$3="No Show"} 1' file
id,name,status,taglist
1,nobody,No Show,"something,something else,rambling,blah,No Show,blah"
2,quitter,closed,"something,stuff,nonsense,blah"
3,somebody,accepted,"something,more stuff,sure thing,blah"

или если вы хотите получить еще более конкретную информацию о том, какое подполе в 4-м полепроверить:

$ awk -v FPAT='([^,]*)|("[^"]*")' -v OFS=',' '{split($4,f,OFS)} f[5]=="No Show"{$3="No Show"} 1' file
id,name,status,taglist
1,nobody,No Show,"something,something else,rambling,blah,No Show,blah"
2,quitter,closed,"something,stuff,nonsense,blah"
3,somebody,accepted,"something,more stuff,sure thing,blah"

в противном случае это просто:

$ awk 'BEGIN{FS=OFS=","} /No Show/{$3="No Show"} 1' file
id,name,status,taglist
1,nobody,No Show,"something,something else,rambling,blah,No Show,blah"
2,quitter,closed,"something,stuff,nonsense,blah"
3,somebody,accepted,"something,more stuff,sure thing,blah"
0 голосов
/ 11 мая 2019

Сед раствор:

sed '/No Show/s/\([^,]*,[^,]*,\)closed,/\1No Show,/'

Чтобы написать новый файл, как в вашем примере:

sed '/No Show/s/\([^,]*,[^,]*,\)closed,/\1No Show,/' myfile.csv > updated.csv
...