我这里有一个非常奇怪的文件格式,它使用任意数量的制表符和空格来分隔字段(甚至是尾随字段)。另一个特点是,字段可以添加空格,然后以CSV方式进行转义。
一个例子:
0 "some string" 234 23947 123 ""some escaped"string""
我尝试用awk解析这些列,我需要在数组中包含每个项目,例如。
foo[0] -> 0
foo[1] -> "some string"
foo[2] -> 234
foo[3] -> 23947
foo[4] -> 123
foo[5] -> ""some escaped"string""
这甚至可能吗?我读了http://web.archive.org/web/20120531065332/http://backreference.org/2010/04/17/csv-parsing-with-awk/,它说解析csv已经非常难了(首先它应该足以解析带有空格的普通字符串,转义变体是非常罕见的)
在我搞砸了很久之前:有没有办法在awk中这样做或者我会更好地使用其他语言?
答案 0 :(得分:1)
使用GNU awk for FPAT:
$ cat tst.awk
BEGIN { FPAT="\\S+|\"[^\"]+\"|,[^,]+," }
{
gsub(/@/,"@A")
gsub(/,/,"@B")
gsub(/""/,",")
for (i=1; i<=NF; i++) {
gsub(/,/,"\"\"",$i)
gsub(/@B/,",",$i)
gsub(/@A/,"@",$i)
print i, $i
}
}
$ awk -f tst.awk file
1 0
2 "some string"
3 234
4 23947
5 123
6 ""some escaped"string""
要了解这是做什么的,请参阅https://stackoverflow.com/a/40512703/1745001