2016-11-10 42 views
0

分離列我這裏有一個很奇怪的FILEFORMAT,它使用製表和空格的任何數額單獨場(偶數尾隨和領導者)。另一個特點是,可以在這些字段中添加空格,然後以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

你最好將時間花在哄從生產系統中的正確格式的輸出; - /(是的,CSV而unix工具有不同的哲學背景。)祝你好運。 – shellter

+0

@shellter哈哈:d這將可能不會發生......這些文件是由一些軟件產生只能在Windows上運行,一些半書面文件和我嘗試將它們轉換成便於閱讀的格式...:/開發人員已經表示他不會支持他自己的任何軟件,所以唯一的辦法就是用我自己的方式來轉換文件。我不知道他怎麼能讀他的產品 – reox

+0

文件快速瀏覽後,我會說,解決方案應該是有狀態的,如果使用正則表達式先行將需要哪些awk不支持。我應該說,它真的很難使用awk做的和別人的代碼會在它15分鐘... –

回答

1

隨着GNU AWK爲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

+1

不錯有人發佈了一個測試和證明你的模型與一個相當極端的情況下的Q ;-) – shellter

相關問題