纯 awk 的解决方案,parse_csv 函数通过第一个返回一个 awk 数组,包含分隔好的 CSV 字段,直接用下标取值使用就可以了。注意,awk 的数组下标从 1 开始。
# parse csv files to an awk array.
awk -F, '{
parse_csv(r);
# replace following line with your code.
print r[1], r[2], r[3], r[4];
} function parse_csv(r, _quote, _i, _n) {
_i = 1;
_quote = 0; # in a quoted string or not.
for (_n = 1; _n <= NF; _n++) {
if (_quote) {
# quote string meets its end.
if (substr($_n, length($_n), 1) == "\"") {
_quote = 0;
r[_i] = r[_i]","substr($_n, 1, length($_n) - 1);
_i++;
} else {
# concat quote string with ",".
r[_i] = r[_i]","$_n;
}
} else {
# it is a quote string.
if (substr($_n, 1, 1) == "\"") {
_quote = 1;
r[_i] = substr($_n, 2);
} else {
# copy content for normal string without quote.
r[_i] = $_n;
_i++;
}
}
}
}'