Ибо, как простой входной файл, как вы можете просто написать небольшую функцию для преобразования всех реального ФПА вне кавычек на другое значение (я выбрал RS, так как разделитель записи не может быть часть записи), а затем использовать его в качестве ФС, например:
$ cat decsv.awk
BEGIN{ fs=FS; FS=RS }
{
decsv()
for (i=1;i<=NF;i++) {
printf "Record %d, Field %d is <%s>\n" ,NR,i,$i
}
print ""
}
function decsv( curr,head,tail)
{
tail = $0
while (match(tail,/"[^"]+"/)) {
head = substr(tail, 1, RSTART-1);
gsub(fs,RS,head)
curr = curr head substr(tail, RSTART, RLENGTH)
tail = substr(tail, RSTART + RLENGTH)
}
gsub(fs,RS,tail)
$0 = curr tail
}
$ cat file
id, name, value
1, foo, 17
2, bar, 76
3, "I am the, question", 99
$ awk -F", " -f decsv.awk file
Record 1, Field 1 is <id>
Record 1, Field 2 is <name>
Record 1, Field 3 is <value>
Record 2, Field 1 is <1>
Record 2, Field 2 is <foo>
Record 2, Field 3 is <17>
Record 3, Field 1 is <2>
Record 3, Field 2 is <bar>
Record 3, Field 3 is <76>
Record 4, Field 1 is <3>
Record 4, Field 2 is <"I am the, question">
Record 4, Field 3 is <99>
становится только сложнее, когда приходится иметь дело с внедренными переводы строк и заливали кавычки экранированы в кавычки, и даже тогда это не слишком сложно, и это все было сделано до ...
Это действительно неуклюже, он терпит неудачу, если поле не является числом. @ Ответ Стива гораздо лучше. – smci
Не только это, похоже, будет успешным, если строка содержит число. Вряд ли когда-либо читал такой плохой принятый ответ. –
Другая проблема с этим ответом заключается в том, что если «значение» отсутствует в строке, предполагается, что «id» - это значение, если в программу awk не добавлено больше логики, чтобы сказать «если элемент в строке является числовым а не первый элемент ... » – benson