2016-12-26 30 views
0

我有一個文本文件looks like this。我試圖將其轉換爲標準格式,其中列分隔符爲,(已存在,\r\n爲行終止符)從大文件中刪除空行並使用sed創建分隔文件

問題是,當前文件有點類似於固定寬度+逗號分隔。有167列用逗號分隔,當前文件中的行形成多行,每行有一行行終止符,大多數加載/外部表工具都不支持這種格式,每行之後還有空行,我希望除去

我曾嘗試SED到目前爲止 -

zcat myfile.txt.gz | sed 's/^\ *$/%%%/g' | xargs | sed -e 's/%%%/\n/g' -e 's/\ //g' > myfile.txt 

上面確實轉換了文件,一切看起來都很好。但我注意到有些行沒有正確轉換。例如,在一些行中,我只有117列。

我在sed中缺少什麼?有沒有更好/更快的方法來做到這一點?請注意,我處理的文件大約是每個未壓縮的25 GB,並且我有超過100個文件。

Sample input

Desired Output(前兩個樣品輸入線)

+0

什麼是您預期的輸出從那個文件? – Inian

+1

請將樣本輸入和您希望的輸出樣本輸入**添加到您的問題**中。 – Cyrus

+0

我已經更新了樣本輸入和期望輸出的問題。 –

回答

1

我真的做這種方式:

zcat myfile.txt.gz | while read line ; do if test "$line" = "" ; then printf "\r\n" ; else printf "$line" ; fi ;done > myfile.txt 

在樣品輸入我獲得總168列(167個逗號)。您可以運行此代碼來驗證每行逗號的數量。獲得

zcat myfile.txt.gz | while read line ; do if test "$line" = "" ; then printf "\r\n" ; else printf "$line" ; fi ;done | sed s/[^,]//g | while read a ; do echo "$a" | wc -c ; done 

輸出從您共享所需的輸出略有不同(我有一個額外的0)

0

我終於實現了這一點,它解決了這個問題:

zcat myfile.txt.gz | sed -r 's/[ ]+/vin/g'|tr -d '\n'|tr 'vinvin' '\n'|grep -v '^$' > myfile.txt