拆分带有制表符和空格

时间:2016-11-10 20:32:01

标签: csv awk

我这里有一个非常奇怪的文件格式,它使用任意数量的制表符和空格来分隔字段(甚至是尾随字段)。另一个特点是,字段可以添加空格,然后以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中这样做或者我会更好地使用其他语言?

1 个答案:

答案 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