当字段终止字符出现在字段值中时

当字段终止字符出现在字段值中时

我度过了一个丰富多彩的早晨,学习了 Linuxsort命令的内部结构,又遇到了一个我似乎无法找到答案的问题。文档

我目前使用来-t,表示我的字段由逗号字符分隔,但我发现在我的某些文件中,值内使用逗号(在双引号之间):

Jonathan Sampson,,[email protected],0987654321
"Foobar CEO,","CEO,",[email protected],,

我怎样才能使用逗号来终止我的字段,但忽略它在值中的出现?这是否相当简单,还是我需要使用更外来的字段终止符重新导出我的所有数据?(不幸的是,我无法控制在这个特定项目中声明不同的终止符)。

答案1

我认为sort对字段分隔符的想法非常简单。制表符可能是一个不错的选择。

答案2

CSV 格式允许字段包含逗号,前提是该字段被引用:

field1, "field2,with,commas"  ,  field3  ,  "field4,foo"

这里我们混合了带引号和不带引号的字段,无法通过 FS 的任何值直接解析(至少据我所知)。但是,我们仍然可以在循环中使用 match() 获取字段(并稍微作弊):

$0=$0",";                                  # yes, cheating

while($0) {

  match($0,/[^,]*,| *"[^"]*" *,/);            

  sf=f=substr($0,RSTART,RLENGTH);          # save what matched in sf

  gsub(/^ *"?|"? *,$/,"",f);               # remove extra stuff

  print "Field " ++c " is " f;

  sub(sf,"");                              # "consume" what matched

}

随着格式的复杂性增加(例如,当字段中允许使用转义引号时),awk解决方案变得更加脆弱。虽然我不应该在这里说这个,但对于比上一个示例更复杂的事情,我建议使用其他工具(例如,Perl 只是其中之一)。顺便说一句,这里似乎有一个awkCSV 解析库:http://lorance.freeshell.org/csv/(我还没尝试过)。

相关内容