我度过了一个丰富多彩的早晨,学习了 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 只是其中之一)。顺便说一句,这里似乎有一个awk
CSV 解析库:http://lorance.freeshell.org/csv/(我还没尝试过)。