単純な入力ファイルの場合、引用符の外側にあるすべての実際のFSを他の値に変換する小さな関数を記述して(レコード区切り文字をレコードの一部にすることはできないため、RSを選択しました)、それを次のように使用できます。 FS、例:
$ 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>
埋め込まれた改行と引用符内の埋め込まれたエスケープされた引用符を処理する必要がある場合にのみ複雑になりますが、それでもそれほど難しくはなく、すべて以前に行われています...
awkを使用してCSVを効率的に解析するための最も堅牢な方法は何ですか?を参照してください。詳細については。