Если вы ДЕЙСТВИТЕЛЬНО просто хотите удалить запятые в этом поле, тогда с помощью GNU awk для 3-го аргумента для match ():
awk 'match($0,/(([^,]*,){3})(.*)((,[^,]*){2})/,a){gsub(/,/,"",a[3]); $0=a[1] a[3] a[4]} 1' file
col1, col2, col3, col4, col5, col6
col1, col2, col3, col4, col5, col6
col1, col2, col3, col4, col5, col6
но в противном случае я бы просто обернул проблемное поле в двойные кавычки, а затем обработал его как любой другой CSV (например, см. Какой самый надежный способ эффективного анализа CSV с помощью awk? ):
$ awk 'match($0,/(([^,]*,){3})(.*)((,[^,]*){2})/,a){$0=a[1] "\"" a[3] "\"" a[4]} 1' file
col1, col2, col3," co,,,l4", col5, col6
col1, col2, col3," co,,,,,l4", col5, col6
col1, col2, col3," co,,l4", col5, col6
$ awk '
BEGIN { FPAT="[^,]*|\"[^\"]+\"" }
match($0,/(([^,]*,){3})(.*)((,[^,]*){2})/,a) { $0=a[1] "\"" a[3] "\"" a[4] }
{ for (i=1; i<=NF; i++) print NR, NF, i, $i }
' file
1 6 1 col1
1 6 2 col2
1 6 3 col3
1 6 4 " co,,,l4"
1 6 5 col5
1 6 6 col6
2 6 1 col1
2 6 2 col2
2 6 3 col3
2 6 4 " co,,,,,l4"
2 6 5 col5
2 6 6 col6
3 6 1 col1
3 6 2 col2
3 6 3 col3
3 6 4 " co,,l4"
3 6 5 col5
3 6 6 col6
или просто сделать цитату с помощью sed:
$ sed -E 's/(([^,]*,){3})(.*)((,[^,]*){2})/\1"\3"\4/' file
col1, col2, col3," co,,,l4", col5, col6
col1, col2, col3," co,,,,,l4", col5, col6
col1, col2, col3," co,,l4", col5, col6
Выше требуется GNU или BSD / OSX sed для -E
. С любым POSIX sed это будет:
$ sed 's/\(\([^,]*,\)\{3\}\)\(.*\)\(\(,[^,]*\)\{2\}\)/\1"\3"\4/' file
col1, col2, col3," co,,,l4", col5, col6
col1, col2, col3," co,,,,,l4", col5, col6
col1, col2, col3," co,,l4", col5, col6