如果您真的只是想删除该字段中的逗号,那么使用 GNU awk 将第三个参数匹配():
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 一样对待它(例如,参见 What's the most robust way to efficiently parse CSV using 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
以上要求-E 需要 GNU 或 BSD/OSX sed。使用任何 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